思路:每次翻转一整列,然后经过N次翻转后,统计行数(一行中每个字母相同)。当存在规律相同的行的时候则相同列反转后都会变成字母相同例如(1010和0101,翻转后会变成1111,0000)。因此处理方法是找到矩阵中规律相同的行数;可以通过map key进行统计
class Solution {
public int maxEqualRowsAfterFlips(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return 0;
// 列反转后,行值相等,求取最大行数
// 实际上可以理解为存在相同的规律的行最大有多少(相同规律指的是,1010,0101,这两种为相同规律)
Map<String,Integer> countMap = new HashMap();
for (int[] row : matrix) {
StringBuilder sb = new StringBuilder();
// 首位为0 ,直接添加,否则进行置反,使其统一
if (row[0] == 1) {
for(int num : row) {
sb.append(1 - num);
}
} else {
for(int num : row) {
sb.append(num);
}
}
String key = sb.toString();
countMap.put(key, countMap.getOrDefault(key,0) + 1);
}
int max = 0;
for (int m : countMap.values()) {
max = Math.max(max,m);
}
return max;
}
}
Q.E.D.