【位運算】B013_LC_ 按列翻轉得到最大值等行數(統計行的模式數)

一、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 變量…

複雜度分析
  • 時間複雜度:O(n×m)O(n × m)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章