leedcode—problem861
rank:medium
1.问题
给定一个二维的矩阵(矩阵的数全由1和0组成),任意反转矩阵的每一行和每一列(0反转成1,1反转成0),求出最大矩阵分数,矩阵分数的求法是矩阵每一行代表二进制数,首位是最高位,根据二进制求出十进制,计算出每一行的十进制后,将所有十进制相加,返回结果,详细描述如图所示
2.解决方案
1 class Solution:
2 def matrixScore(self, A):
3 """
4 :type A: List[List[int]]
5 :rtype: int
6 """
7 height = len(A)
8 width = len(A[0])
9
10 def toggle_row(A, row):
11 for j in range(width):
12 if A[row][j]:
13 A[row][j] = 0
14 else:
15 A[row][j] = 1
16 return A
17
18 def toggle_column(A, column):
19 for i in range(height):
20 if A[i][column]:
21 A[i][column] = 0
22 else:
23 A[i][column] = 1
24 return A
25
26 def count_column_one(A, column):
27 num = 0
28 for i in range(height):
29 if A[i][column] == 1:
30 num += 1
31 return num
32
33 for i in range(height):
34 if A[i][0] == 0:
35 A = toggle_row(A, i)
36
37 for j in range(width-1):
38 num = count_column_one(A, j+1)
39 if num < height/2:
40 A = toggle_column(A,j+1)
41 from functools import reduce
42 result = 0
43 for i in range(height):
44 result += reduce(lambda x,y: x*2+y, A[i])
45 return result
具体思路:首先我们要知道怎么能求出最大矩阵分数,一个二进制数,它的值大小,最高位是贡献最大(1/2值),比后面低位加起来贡献还大,所以要使这个二进制数尽可能大,最高位必须为1,也就是矩阵所有的行的第一位需置1,所以这里有一个toggle_row函数,用来反转行让首位置1。然后再是列反转,列反转的条件是在当前列,数字1的个数小于矩阵行数的1/2,则说明0的个数较多,反转列(使用toggle_column)将增大结果,依次循环第二列到最后一列即可。最后利用reduce函数求出每一行的结果并进行求和即可。
参考
1.https://leetcode.com/contest/weekly-contest-91/problems/score-after-flipping-matrix/