假设我们有一个二维二进制矩阵。对于给定矩阵中的任何行或列,我们都可以翻转所有位。如果我们可以执行任意数量的这些操作,并且将每一行都视为二进制数,则必须找到可以由这些数字构成的最大和。
所以,如果输入像
0 | 1 | 0 |
0 | 0 | 1 |
则输出将为11,就像翻转两行得到101和110一样,则总和为5 + 6 = 11
为了解决这个问题,我们将遵循以下步骤-
对于矩阵中的每一行r
对于0到r大小的范围内的i,执行
r [i]:= -r [i] + 1
如果r [0]等于0,则
对于范围1到矩阵列大小的j,执行
对于范围从0到矩阵行大小的i,执行
矩阵[i,j]:=-矩阵[i,j] + 1
cnt:= cnt + 1,如果matrix [i,j]为1,否则为-1
cnt:= 0
对于范围在0到矩阵行数的i,执行
如果cnt <0,则
回答:= 0
对于矩阵中的每一行r
a:= 2 * a + v
a:= 0
对于r中的每个v
ans:= ans + a
返回ans
让我们看下面的实现以更好地理解-
class Solution: def solve(self, matrix): for r in matrix: if r[0] == 0: for i in range(len(r)): r[i] = -r[i] + 1 for j in range(1, len(matrix[0])): cnt = 0 for i in range(len(matrix)): cnt += 1 if matrix[i][j] else -1 if cnt < 0: for i in range(len(matrix)): matrix[i][j] = -matrix[i][j] + 1 ans = 0 for r in matrix: a = 0 for v in r: a = 2 * a + v ans += a return ans ob = Solution()matrix = [ [0, 1, 0], [0, 0, 1] ] print(ob.solve(matrix))
[[0, 1, 0],[0, 0, 1]]
输出结果
11