题号:no861
题目名:翻转矩阵后的得分
原题URL:https://leetcode-cn.com/problems/score-after-flipping-matrix/
题目描述
有一个二维矩阵 A 其中每个元素的值为 0 或 1 。
移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。
在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。
返回尽可能高的分数。
示例
示例 1:
输入:[[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,之后再考虑别的位置
2.根据这个思路,先将第一列所有不为1的位置按照行翻转为1,这样第一列其他也不会受到影响
3.然后从第二列开始翻转,翻转的同时不影响第一行,所以只能列翻转,翻转要求就是当前列0小于1个数的时候,这样这一列的1就会尽量多
4.翻转后在进行计算
解题代码
public class Solution {
public int matrixScore(int[][] A) {
//先将第一列的数据所有0变成1
for (int i = 0; i < A.length; i++) {
//翻转行
if(A[i][0]==0) {
for (int j = 0; j < A[i].length; j++) {
A[i][j] = A[i][j]== 0?1:0;
}
}
}
//将第二列以后所有列只要1的数量小于0的都进行饭庄
for (int i = 1; i < A[0].length; i++) {
int count0 = 0;
int count1 = 0;
for (int j = 0; j < A.length; j++) {
if(A[j][i]==0) count0++;
else count1++;
}
if(count0>count1) {
for (int j = 0; j < A.length; j++) {
A[j][i] = A[j][i]== 0?1:0;
}
}
}
int sum = 0;
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < A[i].length; j++) {
if(A[i][j]==1) sum+=Math.pow(2,A[i].length-1-j);
}
}
return sum;
}
public static void main(String[] args) {
Solution s = new Solution();
int[][] arr = {
{0,0,1,1},{1,0,1,0},{1,1,0,0}
};
int j = s.matrixScore(arr);
System.out.println(j);
}
}