letcode每日一题-翻转矩阵后的得分

先上题目描述

思路:
1.如果我们想让翻转后的矩阵和最大则必须让数组的第一列都为1,所以我们要对第一列不是1的行先进行一个翻转
的操作。
2.当第一列都是1以后我们就可以对除了第一列的列进行操作了,统一列1越多最后的结果也就越大,我们可以统计1
的个数,如果1的个数超过0的则不需要进行翻转,否则进行翻转。
3.实际编写代码时,我们无需修改原矩阵,而是可以计算每一列对总分数的「贡献」,从而直接计算出最高的分数。
假设矩阵共有 m 行 n 列,计算方法如下:
1.对于最左边的列而言,由于最优情况下,它们的取值都为 1,因此每个元素对分数的贡献都为1<<n-1,则贡
献总额为 m(1<<n-1)
2.对于第 jj 列(j>0,此处规定最左边的列是第 0 列)而言,我们统计这一列 0,1 的数量,令其中的最大
值为 k,则 k 是列翻转后的 1 的数量,该列的总贡献为 k
(1<<(n-j-1))。需要注意的是,在统计 0,1 的数量的
时候,要考虑最初进行的行反转。
代码实现如下:


public int matrixScore(int[][] A) {
        int row=A.length,col=A[0].length;
        int rel=row*(1<<col-1);
        for(int i=1;i<col;i++){
            int oneCol=0;
            for(int j=0;j<row;j++){
                if(A[j][0]==1){
                    oneCol+= A[j][i];
                }else{
                    oneCol+= (1-A[j][i]);
                }
            }
            int k = Math.max(oneCol, row - oneCol);
            rel += k * (1 << (col - i - 1));
        }
        return rel;
    }

letcode题目链接:https://leetcode-cn.com/problems/score-after-flipping-matrix/

posted @ 2020-12-07 10:15  CodeWangHAHA  阅读(72)  评论(0编辑  收藏  举报