其他分享
首页 > 其他分享> > 力扣日常#861 翻转矩阵后的得分

力扣日常#861 翻转矩阵后的得分

作者:互联网

 1 class Solution {
 2     public int matrixScore(int[][] A) {
 3         int len1 = A.length, len2 = A[0].length;
 4 
 5         for(int i = 0; i < len1; i++){
 6             if(A[i][0] == 0){
 7                 for(int j = 0; j < len2; j++){
 8                     if(A[i][j] == 0){
 9                         A[i][j] = 1;
10                     }else{
11                         A[i][j] = 0;
12                     }
13                 }
14             }
15         }
16 
17         for(int i = 1; i < len2; i++){
18             int count = 0;
19             for(int j = 0; j < len1; j++){
20                 if(A[j][i] == 1) count++;
21             }
22             if(count < (len1 + 1) / 2){
23                 for(int k = 0; k < len1; k++){
24                     if(A[k][i] == 1){
25                         A[k][i] = 0;
26                     }else{
27                         A[k][i] = 1;
28                     }
29                 }
30             }
31         }
32 
33         int num = 0;
34         for(int i = 0; i < len2; i++){
35             double temp = Math.pow(2, len2 - i - 1);
36             for(int j = 0; j < len1; j++){
37                 num += A[j][i]*temp;
38             }
39         }
40         return (int)num;
41     }
42 }

根据官方文字提示写的方法 比较笨 为了获得最高的分数 矩阵最高位(最左边的一行必须是1)所以第一遍循环把第一列为0的整行翻转

然后统计每列的1的个数 如果1的个数比0少 则整列翻转 时间复杂度O(N^2);            m = A.length n = A[0].length

但实际编写代码时 不用修改矩阵 可以按列计算: 最优情况下 最左边的一列为全1 总贡献m * 2^(N - 1)

对于第j列 统计0,1的数量 让其中最大值为k 该列的总贡献为k * 2^(n - j - 1) 统计数量时要考虑最初的行翻转

class Solution {
    public int matrixScore(int[][] A) {
        int m = A.length, n = A[0].length;
        int ret = m * (1 << (n - 1));

        for (int j = 1; j < n; j++) {
            int nOnes = 0;
            for (int i = 0; i < m; i++) {
                if (A[i][0] == 1) {
                    nOnes += A[i][j];
                } else {
                    nOnes += (1 - A[i][j]); // 如果这一行进行了行反转,则该元素的实际取值为 1 - A[i][j]
                }
            }
            int k = Math.max(nOnes, m - nOnes);
            ret += k * (1 << (n - j - 1));
        }
        return ret;
    }
}

↑官方解法 时间复杂度O(NM)

标签:len2,861,++,力扣,int,length,len1,翻转
来源: https://www.cnblogs.com/doomslayer/p/14098842.html