題目鏈結
有乙個二維矩陣 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能使數值更大,因此我們要保證每一行的第乙個位置為1,所以首先遍歷行,當該行第乙個位置不為1時就要對該行進行翻轉。
如:題目所給的樣例對行進行翻轉後得到[1,1,0,0],[1,0,1,0],[1,1,0,0]
下一步是要保證每一列中1的個數都大於行數的一半,因為同一列中的數值都處於同乙個量級(2^x),所以同一列中1的個數越多就能使總和越大。
如:上述翻轉得到的[1,1,0,0],[1,0,1,0],[1,1,0,0]中第1列(下標從0開始)中有兩個1,多於行數的一半(1),所以不用調整;第2列有乙個1,等於行數的一半(1),因此要翻轉,得到[1,1,1,0],[1,0,0,0],[1,1,1,0];第3列有0個1,也要翻轉,得到[1,1,1,1],[1,0,0,1],[1,1,1,1]
行列都處理完之後求得分即可。
**如下:
class
solution
}//交換列中的值
for(
int i=
1;i)//該列中1的個數小於等於行數的一半
if(sum<=row/2)
}//計算答案
int ans=0;
for(
int i=
0;i)for
(int j=
0;j) ans+
=a[j]
[i]*
pow(
2,col-i-1)
;return ans;}}
;
翻轉矩陣後的得分
問題描述 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 翻轉是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任意次數的翻轉後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。返回盡可能高的分數。示例 輸入 0,0,...
翻轉矩陣後的得分
翻轉矩陣後的得分 力扣861題。題目描述 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。返回盡可...
861 翻轉矩陣後的得分
package com.heu.wsq.leetcode 861.翻轉矩陣後的得分 author wsq date 2020 12 7 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任...