LeetCode # 861 行/列翻转矩阵,使各行代表的二进制数之和最大

  1. 行翻转和列翻转的顺序其实不影响最后结果,因此可以先考虑所有行都翻完,再翻转所有列;
  2. 为了使最后相加的结果最大,显然应该使每一行都是尽量最高位为1,以加出最大的2的幂次方,根据翻转的规则,至少可以保证第一列全部翻为1(不是1的行做一下翻转即可),因此先进行行翻转把所有行的第一个值翻为1;
  3. 剩下的列为了使他们总的加给结果的增益最大,显然应该从第二列往后,每列都是尽量使1最多,这可以通过对每列进行列翻转实现(如果这一列的0个数比1多,翻转该列即可)。
  4. 为了提高效率,其实可以直接统计每列的1个数,然后取count1和count0的较大值,乘以该列对应的2的幂次方值即可。
class Solution:
    def matrixScore(self, A: List[List[int]]) -> int:
        res = 0
        l = len(A)
        ll = len(A[0])
        # 将所有行翻转,使得各行第一个数都为1
        for i in range(l):
            if A[i][0] == 0:
                for j in range(ll):
                    A[i][j] = A[i][j]^1
        # 从第一列开始,将各列翻转,使得每列都是1尽量多,这里只统计通过翻转可达到的最大的1的个数,没有实际翻转
        for j in range(ll):
            count_one = [A[i][j] for i in range(l)].count(1)
            res += pow(2, ll-j-1)*max(count_one, l-count_one)
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值