leetcode 861 翻转矩阵后的得分

本文解析了一种解决矩阵翻转问题的策略,通过优先保证每行第一列为1,然后逐列比较1和0的分布,进行行或列翻转以最大化最终得分。代码展示了如何利用贪心思想实现这一过程。

1. 题目描述

 2.思路分析:

1. 首先这里的翻转分为了行翻转和列翻转,我们这里只需要求如何翻转后得到最大值,有点贪心的思想,因为最大值一定是固定的

至于是什么路径到达的最大值不是我们所关心的,我们直接从最大的角度去考虑,为了最大,那么首先保证的是每行的第一列为1

,如果有哪个行的第一列不为1的话,那么就行翻转下,然后剩下就是列的问题,第一列已经被固定了,所以就不需要被考虑了,所以

直接从第二列开始考虑,从第二列开始就是比较1和0的个数谁更多了,如果0多的话,就需要列翻转了,大体思路就是这样

至于题解的代码写的比较省略,主要体现到那个最大值的比较,那个其实就是行翻转,因为比较了0和1的个数,返回值其实就是翻转后的结果了

3.代码

class Solution {
public:
    int matrixScore(vector<vector<int>>& A) {
        int m=A.size(),n=A[0].size(); //行数
        int ret=m*(1<<(n-1));
        for(int j=1;j<n;j++)
        {
            int tmp=0;
            for(int i=0;i<m;i++)
            {
                if(A[i][0]==1)
                {
                    tmp+=A[i][j];
                }else
                {
                    tmp+=(1-A[i][j]);
                }
            }
            int k1=max(tmp,m-tmp);
            ret+=k1*(1<<(n-j-1));
        }
        return ret;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值