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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/score-after-flipping-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
贪心算法
本题解参考了官方题解。
确定了翻转方案后,行翻转和列翻转的执行顺序对最终得分没有任何影响。
根据贪心算法,只关注当下利益最大化,所以要尽可能多地让高位为 1
。
可以通过行翻转,让第一列全部为 1
。然后顺次检查剩余列,如果某一列中 1
的个数少于 0
的个数,则对它进行列翻转,这样总体上就能多得分。
最终统计整个矩阵的得分。
class Solution:
def matrixScore(self, A: List[List[int]]) -> int:
rows, cols = len(A), len(A[0])
# 查看第一列,如果为 0,行翻转为 1
for i in range(rows):
if A[i][0] == 0:
for j in range(cols):
A[i][j] = int(not A[i][j])
# 查看剩余列,如果 0 的个数大于 1 的个数,列翻转
for j in range(1, cols):
c = 0
for i in range(rows):
if A[i][j] == 0:
c += 1
if c > rows // 2:
for i in range(rows):
A[i][j] = int(not A[i][j])
# 统计得分
res = 0
for i in range(rows):
res = res + int(''.join(map(str, A[i])), 2)
return res
运行结果:
执行结果:通过
执行用时:48 ms, 在所有 Python3 提交中击败了69.62% 的用户
内存消耗:13.5 MB, 在所有 Python3 提交中击败了39.74% 的用户
2020.12.7