博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】1072. Flip Columns For Maximum Number of Equal Rows
阅读量:7253 次
发布时间:2019-06-29

本文共 2349 字,大约阅读时间需要 7 分钟。

题目如下:

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: 1Explanation: After flipping no values, 1 row has all values equal.

Example 2:

Input: [[0,1],[1,0]]Output: 2Explanation: 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: 2Explanation: 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

 

转载于:https://www.cnblogs.com/seyjs/p/11026157.html

你可能感兴趣的文章
Windows 上编译 corefx 源码生成 Linux 上可用的 System.Data.SqlClient.dll
查看>>
Sublime python 環境配置和交互加載
查看>>
Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)...
查看>>
十进制到62进制的转换
查看>>
python 后台运行命令
查看>>
【IOS】读取、保存图片的各种方法
查看>>
CCNA第二章
查看>>
CCNP路 由 选 择 原 理
查看>>
input 特殊字符限制
查看>>
String类的subString(i)方法(基于jdk 1.9)
查看>>
Java并发包--ConcurrentLinkedQueue
查看>>
vue.js组件命名
查看>>
python------栈和队列的实现
查看>>
第八章 self sizing cell
查看>>
Linux中Nginx中添加自签证书TLS
查看>>
DFS ZOJ 1002/HDOJ 1045 Fire Net
查看>>
BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解
查看>>
10. ZooKeeper之搭建伪集群模式。
查看>>
Easyui Datagrid 如何实现后台交互显示用户数据列表
查看>>
模块登录页代码
查看>>