一、Problem
給定由若干 0 和 1 組成的矩陣 matrix,從中選出任意數量的列並翻轉其上的 每個 單元格。翻轉後,單元格的值從 0 變成 1,或者從 1 變爲 0 。
返回經過一些翻轉後,行上所有值都相等的最大行數。
輸入:[[0,0,0],[0,0,1],[1,1,0]]
輸出:2
解釋:翻轉前兩列的值之後,後兩行由相等的值組成。
提示:
1 <= matrix.length <= 300
1 <= matrix[i].length <= 300
所有 matrix[i].length 都相等
matrix[i][j] 爲 0 或 1
二、Solution
方法一:
規律
如果某兩行可以通過給定的規則變化後變爲一樣,那麼將這兩行的值異或之後一定等於全 1
a ^ b = c
1101 ^ 0010 = 1111
0101 ^ 1010 = 1111
也就是說我們要將這些行的 01 串 統一成一個模式(類似字符串的模式匹配),最後在得出全部模式中出現最多的次數
class Solution {
public int maxEqualRowsAfterFlips(int[][] g) {
Map<String, Integer> mp = new HashMap<>();
for (int[] a : g) {
StringBuilder sb = new StringBuilder();
for (int j = 1; j < a.length; j++) {
if (a[j-1] != a[j])
sb.append(j);
}
mp.put(sb.toString(), mp.getOrDefault(sb.toString(), 0) + 1);
}
int ans = 0;
for (Map.Entry<String, Integer> e : mp.entrySet()) {
ans = Math.max(ans, e.getValue());
}
return ans;
}
}
Java 8 的 lambda 表達式內不能使用非 final 變量…
複雜度分析
- 時間複雜度:,
- 空間複雜度:,