Score After Flipping Matrix
给一个2d数组, 里面是0和1, 问怎么反转row和column, 值得所有row的和的值最大.
这题是贪婪算法, 首先找第一列中有0的, 翻转, 然后找第二列后边, 每列1比0少的, 翻转即可.
class Solution {
public:
int matrixScore(vector<vector<int>>& A) {
int n = A.size();
int m = A[0].size();
int res = 0;
for(int i = 0; i < n; i++) {
if(!A[i][0]){ // if the first column is zero
for(int j = 0; j < m; j++){
A[i][j] = !A[i][j]; // flip rest numbers
}
}
}
for(int j = 1; j < m; j++) { // from second column
int one = 0;
int zero = 0;
for(int i = 0; i < n; i++){
if(A[i][j])
one++;
else
zero++;
}
if(one < zero){ // if one less than zero
for(int i = 0; i < n; i++){
A[i][j] = !A[i][j]; // flip
}
}
}
for(int i = 0; i < n; i++) { // calculate the result.
int num = 0;
for(int j = 0; j < m; j++){
num = (num << 1) | A[i][j] ;
}
res += num;
}
return res;
}
};