leetcode_861. 翻转矩阵后的得分
【摘要】 目录
一、题目内容
二、解题思路
三、代码
一、题目内容
有一个二维矩阵 A 其中每个元素的值为 0 或 1 。
移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。
在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数...
目录
一、题目内容
有一个二维矩阵 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的个数应该大于0的个数,否则翻转,最终可得到结果;
三、代码
-
class Solution:
-
def matrixScore(self, A: list) -> int:
-
m = len(A)
-
n = len(A[0])
-
-
# 第一列全为1
-
for i in range(m):
-
if A[i][0] == 1:
-
continue
-
else:
-
for j in range(n):
-
A[i][j] = 1 - A[i][j]
-
-
for j in range(n):
-
zero_count = 0
-
for i in range(m):
-
if A[i][j] == 0:
-
zero_count += 1
-
# 某一列 0 的数量超过一半
-
if zero_count * 2 > m:
-
# 置反
-
for i in range(m):
-
if A[i][j] == 0:
-
A[i][j] = 1
-
else:
-
A[i][j] = 0
-
res = 0
-
# 求和
-
for i in range(m):
-
tmp = 0
-
for j in range(n - 1, -1, -1):
-
power = n - j - 1
-
tmp += pow(2, power) * A[i][j]
-
res += tmp
-
return res
-
-
-
if __name__ == '__main__':
-
A = [[0,0,1,1],
-
[1,0,1,0],
-
[1,1,0,0]]
-
s = Solution()
-
ans = s.matrixScore(A)
-
print(ans)
文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。
原文链接:nickhuang1996.blog.csdn.net/article/details/110792044
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)