1. 程式人生 > 其它 >LeetCode-861. 翻轉矩陣後的得分(Java實現)

LeetCode-861. 翻轉矩陣後的得分(Java實現)

技術標籤:LeetCodeLeetCode翻轉矩陣後的得分

LeetCode題號:861. 翻轉矩陣後的得分

描述:有一個二維矩陣A 其中每個元素的值為0或1。移動是指選擇任一行或列,並轉換該行或列中的每一個值:將所有 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;
  2. 豎變換保證其他列(除頭列)1比0多;

class Solution {
    public int matrixScore(int[][] A) {  
       int hang = A.length;
       int lie = A[0].length;
        //1、先翻轉第一列是0的行,0變成1  目的保證最高位為1;
        for (int i = 0; i < hang; i++) {
            //頭位為1的直接跳過
            if (A[i][0] == 1) {
               continue;
            }
            //翻轉該行
            for(int j=0;j<lie;j++){
                //0,1換值
                A[i][j] = A[i][j]^1;//二目運算子;同位為0;否則為1
            }
        }
        //2、然後保證讓後幾列的1儘量多;按列統計
        for (int j = 1; j < lie; j++) {
            int count = 0;//統計每一列的0個數
            for (int i = 0; i < hang; i++) {
                if (A[i][j] == 0) {
                    count++;
                }
            }
            //0的數量超過1,則該行0,1換值
            if (count > hang / 2) { 
                for (int i = 0; i < hang; i++) {
                   A[i][j] = A[i][j]^1;//二目運算子;同位為0;否則為1
                }
            }
        }
        //二進位制計算;
        int ans = 0;
        for (int z = 0; z < hang; z++) {
            for (int k = lie - 1; k >= 0; k--) {
                ans += (A[z][k] * Math.pow(2, lie - k - 1));
            }
        }
        return ans;
    }
}

往期回顧:

【1】LeetCode-164. 最大間距(Java實現)

【2】LeetCode-1370. 上升下降字串(Java實現)

【3】LeetCode-454. 四數相加 II(Java實現)


❤如果文章對您有所幫助,就在文章的右上角或者文章的末尾點個贊吧!(づ ̄ 3 ̄)づ

❤如果喜歡大白兔分享的文章,就給大白兔點個關注吧!(๑′ᴗ‵๑)づ╭❤~

❤對文章有任何問題歡迎小夥伴們下方留言或者入群探討【群號:708072830】

❤鑑於個人經驗有限,所有觀點及技術研點,如有異議,請直接回復討論(請勿發表攻擊言論)