1072. Flip Columns For Maximum Number of Equal Rows
Posted keepac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1072. Flip Columns For Maximum Number of Equal Rows相关的知识,希望对你有一定的参考价值。
题意:
数组只有0 1 组成,现在flip 任意的column , 所谓的 flip 就是把 0 ->1 or 1- >0, 比如 [1 1 0 1] 变成 [0 0 1 0].
求经过翻转后 All 0 or All 1 的 row.
这题蛮烧脑的,仔细想想没那么复杂。
先说这个题目的算法:找row里 相同或者 完全相反 的row 的数目。
这题饶了一大圈,本质就是上面这一点,为什么呢?
假如有一row 1 1 1 0 1 ,如果要把这一行all0 or all1,
只能选择 flip [column 0,1,2,4] 或者 flip [column 3], 注意是要flip 整个column,
因此 绝对不存在同时能把row [1 1 1 0 1] 和[1 0 0 0 1] 变成All 0/1 的情况。
所以当你试图 把[1 1 1 0 1] 变成All 1 时,如果有和这一行相同的行, 或者完全相反的行[0 0 0 1 0] 也会跟着一起 变成All 1 or 0. 大多数情况如果没有相同或者互斥的行,那解只有一个
举个例子:这种情况完全互斥,解只有一个。
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
下面这种,前三行要么相同或者互斥,因此解有三个。
1 0 0 0
1 0 0 0
0 1 1 1
1 1 1 1
因此 就是找相同(互斥) 行 数目的最大值,用hash table 进行优化。
把 0,1 转换成 string
Map<String, Integer> map = new HashMap<>(); int max = 0; for(int i=0 ;i<matrix.length; i++) StringBuilder sb0 = new StringBuilder(); StringBuilder sb1 = new StringBuilder(); for(int j=0; j<matrix[0].length; j++) if(matrix[i][j] == 0) sb0.append(‘0‘); sb1.append(‘1‘); else sb0.append(‘1‘); sb1.append(‘0‘); String s0 = sb0.toString(); String s1 = sb1.toString(); if(map.containsKey(s0) ) map.put(s0,map.get(s0)+1); max = Math.max(max,map.get(s0)); else if(map.containsKey(s1)) map.put(s1,map.get(s1)+1); max = Math.max(max,map.get(s1)); else map.put(s0,1); max = Math.max(max,1); return max;
以上是关于1072. Flip Columns For Maximum Number of Equal Rows的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用transpose函数对dataframe进行转置将dataframe的行和列进行互换(flip the rows and columns in dataframe)