翻转矩阵后的得分
题目
给你一个大小为 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.length
n == grid[i].length
1 <= m, n <= 20
grid[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