翻转矩阵后的得分—力扣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。
先把所有行翻转,使其A[i][0]=1。
之后只需要按列统计0的个数count,小于等于A.length/2,则这一列不需要翻转,1的个数为A.length/2-count,如果大于,则翻转,翻转之后1的个数为count。
代码如下:
class Solution{
public int matrixScore(int[][] A){
for(int i=0;i<A.length;i++){
if(A[i][0]==0){
for(int j=0;j<A[0].length;j++){//翻转行,使每一行的最左边的数都是1.
A[i][j]=A[i][j]==0?1:0;
}
}
}
int result=0;
for(int i=0;i<A[0].length;i++){
int count=0;
for(int j=0;j<A.length;j++){//统计每一列中0的个数
if(A[j][i]==0){
count++;
}
}
if(count<=A.length/2){//0的个数小于等于A.length/2,1的个数等于A.length-count,且不需要翻转;
count=A.length-count;
}
//反之如果大于,则需要翻转,翻转后1的个数就为count;
result+=count*Math.pow(2,A[0].length-i-1);
}
return result;
}
}