861 翻轉矩陣後的得分

2022-09-18 06:27:29 字數 1568 閱讀 1351

有乙個二維矩陣 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 <= a.length <= 20

1 <= a[0].length <= 20

a[i][j] 是 0 或 1

解決這個問題首先要解決什麼呢?就是找到什麼時候返回值最大,毫無疑問,最高位最大時整個數最大,也就是說,整個矩陣首列都要為1,所以遍歷整個矩陣首列,如果該位為0,就把該行翻轉(翻轉操作對1異或即可)。

接下來處理首列之外的資料,因為第一列已經為1,所以不能進行行翻轉了,就遍歷之後的列,如果0多就進行翻轉。

處理完資料之後,矩陣就變成了我們想要的矩陣,從第一列開始,把整列加起來,然後依次乘2加列和,最後得到的結果就是我們要的值,

class solution 

}//處理第一列之後的資料,按列來處理

for(int j = 1; j < a[0].length; j++)

if(num > a.length/2)

break;}}

}//計算結果

for(int j = 0; j < a[0].length; j++)

}return res;

}public void reverse(int arr)

}}

但是這樣處理並不是最優解,因為我們要想想我們要的結果是什麼,只是乙個最大值。但是在求這個最大值的過程中我們對矩陣做了很多沒必要的操作,於是對解法進行優化。

第一步還是不變,對首位為0的行進行翻轉。

重點在第二步和求和的過程中,我們開始做的是如果0的個數大於列長度的一半,就翻轉,這個操作的目的是把列中大多數變成1,最後相加。但是仔細一想,最後都是1相加,這個1的個數就是一列中0和1數量的較大值,所以我們沒有必要對0進行翻轉,只是計算數量即可,並且在計算數量的過程中就可以求出返回值。

class solution }}

for(int j = 1; j < a[0].length; j++)

}num = math.max(num, a.length-num);

res = (res << 1) + num;

}return res;

}}

861 翻轉矩陣後的得分

package com.heu.wsq.leetcode 861.翻轉矩陣後的得分 author wsq date 2020 12 7 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任...

861 翻轉矩陣後的得分

貪心 為了確保得到的值最大,陣列第一列必須是1,首先就可以對二維陣列的第一列不是1的記錄進行反轉,然後再處理列,每列中的1的個數大於一半,就進行反轉。這樣就能確保得到的值最大。這是第一次過題 對二維陣列進行了反轉,其實不用,只需要求值就可以了。class solution for int i 1 i...

861 翻轉矩陣後的得分

題目描述 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。返回盡可能高的分數。示例 輸入 0,0,...