class Solution {
public:
int matrixScore(vector<vector<int>>& grid) {
}
};
861. 翻转矩阵后的得分
有一个二维矩阵 A
其中每个元素的值为 0
或 1
。
移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0
都更改为 1
,将所有 1
都更改为 0
。
在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。
返回尽可能高的分数。
示例:
输入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]] 输出:39 解释: 转换为 [[1,1,1,1],[1,0,0,1],[1,1,1,1]] 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
提示:
1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j]
是 0
或 1
原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 2.1 MB, 提交时间: 2022-11-15 10:49:05
func matrixScore(grid [][]int) int { m, n := len(grid), len(grid[0]) ans := 1 << (n - 1) * m for j := 1; j < n; j++ { ones := 0 for _, row := range grid { if row[j] == row[0] { ones++ } } if ones < m-ones { ones = m - ones } ans += 1 << (n - 1 - j) * ones } return ans }
python3 解法, 执行用时: 32 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-15 10:48:41
class Solution: def matrixScore(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) ans = (1 << (n-1)) * m # 第一列贡献值 for j in range(1, n): # 统计每一列的贡献值 ones = 0 for row in grid: # 统计每一行中1的个数(都同行首,1则不变,0则翻转) if row[j] == row[0]: ones += 1 # 列翻转的条件,取多数1 ones = max(m - ones, ones) ans += (1 << (n-1-j)) * ones return ans