难度:★★★☆☆
类型:数组
方法:数学
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
题目
有一个二维矩阵 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
解答
每一行代表一个二进制数,我们可以先通过翻转(如果最高位不是1)或不翻转的方式把每一行的最高位置1,然后再研究从高位到低位每一列,通过翻转或不翻转的方式将每一列的的1的个数最大化。
class Solution:
def matrixScore(self, A) -> int:
rows, columes = len(A), len(A[0])
def colume_zeros_more_than_ones(matrix, index=0):
return [matrix[i][index] for i in range(rows)].count(0) > (rows / 2)
def flip(matrix, index=0, axis=0):
if axis == 0:
for c in range(columes):
matrix[index][c] = 1 - matrix[index][c]
elif axis == 1:
for r in range(rows):
matrix[r][index] = 1 - matrix[r][index]
else:
raise Exception
return matrix
# 翻转行
for r in range(rows):
if A[r][0] == 0:
A = flip(matrix=A, index=r, axis=0)
# 翻转列
for c in range(columes):
if colume_zeros_more_than_ones(A, c):
A = flip(matrix=A, index=c, axis=1)
return sum([int("".join(map(str, row)), 2) for row in A])
如有疑问或建议,欢迎评论区留言~
有关更多力扣中等题的python解决方案,请移步力扣中等题解析
网友评论