贪心:为了确保得到的值最大,数组第一列必须是1,首先就可以对二维数组的第一列不是1的记录进行反转,然后再处理列,每列中的1的个数大于一半,就进行反转。这样就能确保得到的值最大。
代码:
这是第一次过题代码,对二维数组进行了反转,其实不用,只需要求值就可以了。
class Solution {
public int matrixScore(int[][] A) {
int row = A.length, column = A[0].length;
for (int i = 0; i < row; i++) {
if (A[i][0] == 0) {
for (int j = 0; j < column; j++) {
A[i][j] = 1 - A[i][j];
}
}
}
for (int i = 1; i < column; i++) {
int cnt = 0;
for (int[] ints : A) {
cnt += ints[i];
}
int rowCnt = row >> 1;
if (cnt <= rowCnt) {
for (int j = 0; j < row; j++) {
A[j][i] = 1 - A[j][i];
}
}
}
// 计算最后的值
int matrixScore = 0;
for (int i = 0; i < row; i++) {
int num = 1, sum = 0;
for (int j = column - 1; j >= 0; j--) {
sum += num * A[i][j];
num <<= 1;
}
matrixScore += sum;
}
return matrixScore;
}
}
修改后的代码
class Solution {
public int matrixScore(int[][] A) {
int row = A.length, column = A[0].length;
int matrixScore = 0;
// 1 << (column - 1) 相当于2的column - 1次方
matrixScore += row * (1 << (column - 1));
for (int j = 1; j < column; j++) {
int rowCnt = 0;
// 计算这一列有多少个1
// 因为没有对数组进行修改,这里要判断第一个数是否是1,是1不变,反之
for (int i = 0; i < row; i++) {
if (A[i][0] == 1) rowCnt += A[i][j];
else rowCnt += 1 - A[i][j];
}
matrixScore += Math.max(rowCnt, row - rowCnt) * (1 << (column - j - 1));
}
return matrixScore;
}
}