美文网首页
861. 翻转矩阵后的得分(Python)

861. 翻转矩阵后的得分(Python)

作者: 玖月晴 | 来源:发表于2021-02-26 17:27 被阅读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,然后再研究从高位到低位每一列,通过翻转或不翻转的方式将每一列的的1的个数最大化。

    class Solution:
        def matrixScore(self, A) -> int:
            rows, columes = len(A), len(A[0])
    
            def colume_zeros_more_than_ones(matrix, index=0):
    
                return [matrix[i][index] for i in range(rows)].count(0) > (rows / 2)
    
            def flip(matrix, index=0, axis=0):
                if axis == 0:
                    for c in range(columes):
                        matrix[index][c] = 1 - matrix[index][c]
    
                elif axis == 1:
                    for r in range(rows):
                        matrix[r][index] = 1 - matrix[r][index]
    
                else:
                    raise Exception
    
                return matrix
    
            # 翻转行
            for r in range(rows):
                if A[r][0] == 0:
                    A = flip(matrix=A, index=r, axis=0)
    
            # 翻转列
            for c in range(columes):
                if colume_zeros_more_than_ones(A, c):
                    A = flip(matrix=A, index=c, axis=1)
    
            return sum([int("".join(map(str, row)), 2) for row in A])
    
    

    如有疑问或建议,欢迎评论区留言~

    有关更多力扣中等题的python解决方案,请移步力扣中等题解析

    相关文章

      网友评论

          本文标题:861. 翻转矩阵后的得分(Python)

          本文链接:https://www.haomeiwen.com/subject/yzritltx.html