《Leetcode of December》861. 翻转矩阵后的得分

class Solution:
    def matrixScore(self, A: List[List[int]]) -> int:
        #未优化
        if not A:
            return 0
        
        row,col = len(A),len(A[0])
        #保证第一列都是1
        for i in range(row):
            if A[i][0]==0:
                for j in range(col):
                    if A[i][j]==0:
                        A[i][j]=1
                    else:
                        A[i][j]=0
        
        for i in range(1,col):
            one=0
            for j in range(row):
                if A[j][i]==1:
                    one+=1
            
            if one<row-one:
                for j in range(row):
                    if A[j][i]==0:
                        A[j][i]=1
                    else:
                        A[j][i]=0
        res=0
        for row in A:
            row = ''.join([str(i) for i in row])
            res+=int(row,2)

        return res

        #优化

        if not A:
            return 0
        score=0
        row,col = len(A),len(A[0])
        #保证第一列都是1
        for i in range(row):
            if A[i][0]==0:
                for j in range(col):
                    if A[i][j]==0:
                        A[i][j]=1
                    else:
                        A[i][j]=0
        score = 2**(col-1)*row
        for i in range(1,col):
            one=0
            for j in range(row):
                if A[j][i]==1:
                    one+=1
            one = max(one,row-one)
            score+=2**(col-i-1)*one
        return score    
       
  •  保证第一列全部为1
  •  保证第二列后的每一列的1的个数大于0的个数,否则就翻转
  • 两种方法:
    • 修改原矩阵
      • 笨方法,空间复杂度高
    • 不修改原矩阵
      • 处理第一列修改其余不修改
      • 计算每列的贡献度即可

总结:计算二进制最大值,必须保证靠左边的1越来越多。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/110822887