zoukankan      html  css  js  c++  java
  • 【leetcode】1072. Flip Columns For Maximum Number of Equal Rows

    题目如下:

    Given a matrix consisting of 0s and 1s, we may choose any number of columns in the matrix and flip every cell in that column.  Flipping a cell changes the value of that cell from 0 to 1 or from 1 to 0.

    Return the maximum number of rows that have all values equal after some number of flips.

    Example 1:

    Input: [[0,1],[1,1]]
    Output: 1
    Explanation: After flipping no values, 1 row has all values equal.
    

    Example 2:

    Input: [[0,1],[1,0]]
    Output: 2
    Explanation: After flipping values in the first column, both rows have equal values.
    

    Example 3:

    Input: [[0,0,0],[0,0,1],[1,1,0]]
    Output: 2
    Explanation: After flipping values in the first two columns, the last two rows have equal values.
    

    Note:

    1. 1 <= matrix.length <= 300
    2. 1 <= matrix[i].length <= 300
    3. All matrix[i].length's are equal
    4. matrix[i][j] is 0 or 1

    解题思路:把matrix任意一行的的所有元素拼成一个字符串,例如0010110,要把这行变成全是0或者全是1,那么要经过4次或者3次的列变换。变换之后,很显然matrix中字符串为0010110或者1101001的行最后也会变成全为0或者全为1。因此题目就变成了找出matrix中的某一行,使得在整个matrix中和这行相等的行或者相反的行的最多(即0对应1,1对应0的行)。怎么求出最大值的呢?并查集很适合这个场景。

    代码如下:

    class Solution(object):
        def maxEqualRowsAfterFlips(self, matrix):
            """
            :type matrix: List[List[int]]
            :rtype: int
            """
            parent = [i for i in range(len(matrix))]
    
            def find(v1):
                p1 = parent[v1]
                if p1 != v1:
                    return find(p1)
                return p1
    
            def union(v1,v2):
                p1 = find(v1)
                p2 = find(v2)
                if p1 <= p2:
                    parent[v2] = p1
                else: parent[v1] = p2
            def toString(l1):
                new_l1 = map(lambda x: str(x), l1)
                return ''.join(new_l1)
    
            row = []
            row_inverse = []
            for i in range(len(matrix)):
                row.append(toString(matrix[i]))
                v1_inverse = ''
                for k in row[i]:
                    v1_inverse += '0' if k == '1' else '1'
                row_inverse.append(v1_inverse)
    
            for i in range(len(matrix)):
                v1 = row[i]
                v1_inverse = row_inverse[i]
                for j in range(i+1,len(matrix)):
                    v2 = row[j]
                    if v1 == v2 or v1_inverse == v2:
                        union(i,j)
    
            dic = {}
            res = 0
            for i in range(len(matrix)):
                p = find(i)
                dic[p] = dic.setdefault(p,0) + 1
                res = max(res,dic[p])
    
            return res
  • 相关阅读:
    python __path__ 变量
    mysql-5.7.9 shutdown 语法详解
    scikit-learn随机森林调参小结
    supervisor安装部署文档和管理实例
    随机森林种类及区别--g1
    决策树算法原理--good blog
    各种排序算法的时间复杂度
    【Django2.0】python manage.py makemigrations 和 python manage.py migrate的区别
    使用Apollo做配置中心
    lock in share mode 和 select for update
  • 原文地址:https://www.cnblogs.com/seyjs/p/11026157.html
Copyright © 2011-2022 走看看