题意:

数组只有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;   
    }

 

posted on 2019-10-05 04:14  KeepAC  阅读(187)  评论(0编辑  收藏  举报