有一个二维矩阵 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。因为第一位数的权值比后面所有位数的权值加起来都要大。比如8:1000和7:0111。所以让第一位数为1的翻转方式一定是最大的。
然后纵向翻转。纵向的的权值都是一样的,那就让1的个数尽可能多就好,也就是比较1和0的个数,如果1比0少,那就翻转,否则就不翻转。
最后把二进制转换为十进制并求和,得到最终结果。
代码如下:
def matrixScore(self, A):
"""
:type A: List[List[int]]
:rtype: int
"""
for i in range(len(A)): #横向翻转
if A[i][0] == 0:
for j in range(len(A[0])):
A[i][j] = A[i][j] ^ 1 #和1异或可以翻转,或者用1-A[i][j]也行
for i in range(len(A[0])): #纵向翻转
num1, num0 = 0, 0
for j in range(len(A)):
if A[j][i] == 1:
num1 += 1
num0=len(A)-num1
if num1 < num0:
for j in range(len(A)):
A[j][i] = A[j][i] ^ 1
res = 0
for i in A:
t=0
for j in i:
t = t * 2 + j
res+=t
return res
网友评论