有乙個二維矩陣 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,...