1. 程式人生 > 其它 >[LeetCode] 1072. Flip Columns For Maximum Number of Equal Rows

[LeetCode] 1072. Flip Columns For Maximum Number of Equal Rows

You are given anm x nbinary matrixmatrix.

You can choose any number of columns in the matrix and flip every cell in that column (i.e., Change the value of the cell from0to1or vice versa).

Returnthe maximum number of rows that have all values equal after some number of flips.

Example 1:

Input: matrix = [[0,1],[1,1]]
Output: 1
Explanation: After flipping no values, 1 row has all values equal.

Example 2:

Input: matrix = [[0,1],[1,0]]
Output: 2
Explanation: After flipping values in the first column, both rows have equal values.

Example 3:

Input: matrix = [[0,0,0],[0,0,1],[1,1,0]]
Output: 2
Explanation: After flipping values in the first two columns, the last two rows have equal values.

Constraints:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j]is either0or1.

按列翻轉得到最大值等行數。

給定由若干 0 和 1 組成的矩陣matrix,從中選出任意數量的列並翻轉其上的每個單元格。翻轉後,單元格的值從 0 變成 1,或者從 1 變為 0 。

回經過一些翻轉後,行與行之間所有值都相等的最大行數。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/flip-columns-for-maximum-number-of-equal-rows
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

這裡我提供一個思路,參考了美版 discussion 的最高票答案

題目給的是一個只有 0 和 1 的矩陣,問你能否通過翻轉任意列 column 裡所有的單元格(從 0 變 1 或者從 1 變 0),從而使得經過翻轉操作後的矩陣裡有儘可能多的行 row 的值是一樣的(全是 0 或者全是 1)。假設這樣一種情況,如果在經過某次翻轉操作後,使得第 i 行都為 0 了,那麼我們可以得到如下結論

  • 如果此時第 j 行上所有的值也為 0,說明第 j 行在翻轉前跟第 i 行應該是一樣的
  • 如果此時有一個第 k 行上所有的值為1,說明第 k 行在翻轉前跟第 i 行應該是恰好相反的

所以這個問題可以轉化為找到一個第 i 行使得與這個 row 完全相同的 row 或者完全相反的 row 最多。

具體的做法是我們需要掃描這個二維矩陣,對於當前要掃描的行 row 的所有值我們取反,記為 row2,比如 000110 我們找到 111001,然後去矩陣裡找看有多少行是和 row 或者 row2 相同的。

時間O(mn)

空間O(n)

Java實現

 1 class Solution {
 2     public int maxEqualRowsAfterFlips(int[][] matrix) {
 3         int res = 0;
 4         int m = matrix.length;
 5         int n = matrix[0].length;
 6         for (int i = 0; i < m; i++) {
 7             int count = 0;
 8             int[] flip = new int[n];
 9             for (int j = 0; j < n; j++) {
10                 flip[j] = 1 - matrix[i][j];
11             }
12             for (int k = i; k < m; k++) {
13                 if (Arrays.equals(matrix[k], matrix[i]) || Arrays.equals(matrix[k], flip)) {
14                     count++;
15                 }    
16             }
17             res = Math.max(res, count);
18         }
19         return res;
20     }
21 }

LeetCode 題目總結