力扣 861. 翻转矩阵后的得分

861. 翻转矩阵后的得分

861. 翻转矩阵后的得分

题目描述

有一个二维矩阵 A 其中每个元素的值为 01

移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 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. 1 <= A.length <= 20
  2. 1 <= A[0].length <= 20
  3. A[i][j]01

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/score-after-flipping-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


贪心算法

本题解参考了官方题解

确定了翻转方案后,行翻转和列翻转的执行顺序对最终得分没有任何影响。

根据贪心算法,只关注当下利益最大化,所以要尽可能多地让高位为 1

可以通过行翻转,让第一列全部为 1。然后顺次检查剩余列,如果某一列中 1 的个数少于 0 的个数,则对它进行列翻转,这样总体上就能多得分。

最终统计整个矩阵的得分。

class Solution:
    def matrixScore(self, A: List[List[int]]) -> int:
        rows, cols = len(A), len(A[0])
        # 查看第一列,如果为 0,行翻转为 1
        for i in range(rows):
            if A[i][0] == 0:
                for j in range(cols):
                    A[i][j] = int(not A[i][j])
        # 查看剩余列,如果 0 的个数大于 1 的个数,列翻转
        for j in range(1, cols):
            c = 0
            for i in range(rows):
                if A[i][j] == 0:
                    c += 1
            if c > rows // 2:
                for i in range(rows):
                    A[i][j] = int(not A[i][j])
        # 统计得分
        res = 0
        for i in range(rows):
            res = res + int(''.join(map(str, A[i])), 2)
        return res

运行结果

执行结果:通过
执行用时:48 ms, 在所有 Python3 提交中击败了69.62% 的用户
内存消耗:13.5 MB, 在所有 Python3 提交中击败了39.74% 的用户


2020.12.7

公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值