Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/861.html
861. Score After Flipping Matrix (Medium)
We have a two dimensional matrix A
where each value is 0
or 1
.
A move consists of choosing any row or column, and toggling each value in that row or column: changing all 0
s to 1
s, and all 1
s to 0
s.
After making any number of moves, every row of this matrix is interpreted as a binary number, and the score of the matrix is the sum of these numbers.
Return the highest possible score.
Example 1:
Input: [[0,0,1,1],[1,0,1,0],[1,1,0,0]] Output: 39 Explanation: Toggled to [[1,1,1,1],[1,0,0,1],[1,1,1,1]]. 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
Note:
1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j]
is0
or1
.
Companies:
IIT Bombay
Related Topics:
Greedy
Solution 1.
- Makes sure the first column only contains 1s by toggling a row if the first element in the row is 0.
- For the remaining columns, if there are more 0s than 1s, toggle the column.
// OJ: https://leetcode.com/problems/score-after-flipping-matrix/
// Time: O(MN)
// Space: O(1)
class Solution {
public:
int matrixScore(vector<vector<int>>& A) {
int M = A.size(), N = A[0].size(), ans = 0;
for (int i = 0; i < M; ++i) {
if (A[i][0]) continue;
for (int j = 0; j < N; ++j) A[i][j] = 1 - A[i][j];
}
for (int j = 1; j < N; ++j) {
int one = 0;
for (int i = 0; i < M; ++i) one += A[i][j];
if (one * 2 >= M) continue;
for (int i = 0; i < M; ++i) A[i][j] = 1 - A[i][j];
}
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) ans += A[i][j] * (1 << (N - j - 1));
}
return ans;
}
};
-
class Solution { public int matrixScore(int[][] A) { int rows = A.length, columns = A[0].length; for (int i = 0; i < rows; i++) { if (A[i][0] == 0) { for (int j = 0; j < columns; j++) A[i][j] = 1 - A[i][j]; } } for (int i = 1; i < columns; i++) { int ones = 0; for (int j = 0; j < rows; j++) ones += A[j][i]; if (ones < rows - ones) { for (int j = 0; j < rows; j++) A[j][i] = 1 - A[j][i]; } } int score = 0; for (int i = 0; i < rows; i++) { int[] row = A[i]; int curScore = 0; for (int j = 0; j < columns; j++) { curScore *= 2; curScore += row[j]; } score += curScore; } return score; } } ############ class Solution { public int matrixScore(int[][] grid) { int m = grid.length, n = grid[0].length; for (int i = 0; i < m; ++i) { if (grid[i][0] == 0) { for (int j = 0; j < n; ++j) { grid[i][j] ^= 1; } } } int ans = 0; for (int j = 0; j < n; ++j) { int cnt = 0; for (int i = 0; i < m; ++i) { cnt += grid[i][j]; } ans += Math.max(cnt, m - cnt) * (1 << (n - j - 1)); } return ans; } }
-
// OJ: https://leetcode.com/problems/score-after-flipping-matrix/ // Time: O(MN) // Space: O(1) class Solution { public: int matrixScore(vector<vector<int>>& A) { int M = A.size(), N = A[0].size(), ans = 0; for (int i = 0; i < M; ++i) { if (A[i][0]) continue; for (int j = 0; j < N; ++j) A[i][j] = 1 - A[i][j]; } for (int j = 1; j < N; ++j) { int one = 0; for (int i = 0; i < M; ++i) one += A[i][j]; if (one * 2 >= M) continue; for (int i = 0; i < M; ++i) A[i][j] = 1 - A[i][j]; } for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) ans += A[i][j] * (1 << (N - j - 1)); } return ans; } };
-
class Solution: def matrixScore(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) for i in range(m): if grid[i][0] == 0: for j in range(n): grid[i][j] ^= 1 ans = 0 for j in range(n): cnt = sum(grid[i][j] for i in range(m)) ans += max(cnt, m - cnt) * (1 << (n - j - 1)) return ans ############ class Solution(object): def matrixScore(self, A): """ :type A: List[List[int]] :rtype: int """ rows, cols = len(A), len(A[0]) for row in range(rows): if A[row][0] == 0: A[row] = self.toggle_row(A[row]) for col in range(1, cols): col_array = [A[row][col] for row in range(rows)] sum_col_array = sum(col_array) if sum_col_array <= rows / 2: col_array = self.toggle_col(col_array) for row in range(rows): A[row][col] = col_array[row] bin_row = [] for row in range(rows): bin_row.append(int("".join(map(str, A[row])), 2)) return sum(bin_row) def toggle_row(self, row_array): return [0 if x == 1 else 1 for x in row_array] def toggle_col(self, col_array): return [0 if x == 1 else 1 for x in col_array]
-
func matrixScore(grid [][]int) int { m, n := len(grid), len(grid[0]) for i := 0; i < m; i++ { if grid[i][0] == 0 { for j := 0; j < n; j++ { grid[i][j] ^= 1 } } } ans := 0 for j := 0; j < n; j++ { cnt := 0 for i := 0; i < m; i++ { cnt += grid[i][j] } if cnt < m-cnt { cnt = m - cnt } ans += cnt * (1 << (n - j - 1)) } return ans }
-
function matrixScore(grid: number[][]): number { const m = grid.length; const n = grid[0].length; for (let i = 0; i < m; ++i) { if (grid[i][0] == 0) { for (let j = 0; j < n; ++j) { grid[i][j] ^= 1; } } } let ans = 0; for (let j = 0; j < n; ++j) { let cnt = 0; for (let i = 0; i < m; ++i) { cnt += grid[i][j]; } ans += Math.max(cnt, m - cnt) * (1 << (n - j - 1)); } return ans; }