翻转矩阵后的得分
题目
给你一个大小为 m x n 的二元矩阵 grid ,矩阵中每个元素的值为 0 或 1 。
一次 移动 是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。
在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的 得分 就是这些数字的总和。
在执行任意次 移动 后(含 0 次),返回可能的最高分数。
示例 1:

1 | 输入:grid = [[0,0,1,1],[1,0,1,0],[1,1,0,0]] |
示例 2:
1 | 输入:grid = [[0]] |
提示:
m == grid.lengthn == grid[i].length1 <= m, n <= 20grid[i][j]为0或1
解题
这道题使用了贪心策略。
首先我们知道,矩阵有m行n列。这里我们设首列(最左边的列)是第0列。
贪心思路是这样的:
- 将首列全部变为
1(为了得到最高的分数) - 接着对于后续每一列,我们都让该列上
1的数目尽可能的多(如果该列上0的数目多于1的数目,就翻转该列)
在实际编码时,我们是这样实现的:
- 首先,我们初始化结果变量
ret为矩阵的行数m乘以2的n-1次方。因为我们首先将首列全部变为1嘛,而首列的权值是2^(n-1)。 - 接着,对于后续的每一列(从第一列开始遍历到最后一列):
- 我们统计当前列中
1的数量以及0的数量。 - 然后取两者中较大的值,我们设为
k,k就是翻转后1的数量。 - 然后将
k乘以2的n-j-1次方,再累加到ret变量即可。
- 我们统计当前列中
- 最终将
ret变量返回。
在计算每一列上
1的数量时,我们是这么计算的:
- 如果首列的元素是
1,直接加上当前列的值- 如果首列的元素是
0,则需要加上当前列值为0的元素个数(这是因为首列元素为0,则需要翻转该行将首列元素变为1。那么该行上为0的元素翻转后就是1了)。
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 翼同学的个人博客!
评论
ValineDisqus




