题目链接https://leetcode-cn.com/problems/flip-columns-for-maximum-number-of-equal-rows/
题目看起来让人摸不着头脑,其实看懂题目就会变得特别的简单了。
1、首先该函数返回的最小的值应该是1
2、两行数字,经过对一些列的反转,最后都达到这一行的值的相同。那么这两行数字的关系有以下两种情况:
1).两行的数字都相同
2).两行的数字的值都是相反的
代码如下
class Solution {
public:
int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
if (matrix.empty()) {
return 0;
}
int rowSize = matrix.size();
if (rowSize == 0) {
return 0;
}
int colSize = matrix[0].size();
if (colSize == 0) {
return rowSize;
}
/* 两行数字,经过对一些列的反转,最后都达到这一行的值的相同。那么这两行数字的关系有以下两种情况:
* 1.两行的数字都相同
* 2.两行的数字的值都是相反的
* 该函数的返回值至少为1。故下面的temp变量的初始值是1.因为一行的值可以通多0到n-1次的对列做异或运算来使得一行的值全部相同
*/
int result = 0;
for (int i = 0; i < rowSize; i++) {
int temp = 0;
for (int j = i + 1; j < rowSize; j++) {
if (matrix[i] == matrix[j]) {
/* 两个vector相等 */
temp++;
} else {
int k;
/* 两个vector的数字是相反的 */
for (k = 0; k < colSize; k++) {
if (matrix[i][k] + matrix[j][k] != 1) {
break;
}
}
if (k == colSize) {
temp++;
}
}
result = max(result, temp);
}
}
return result;
}
};
代码中的两个循环感觉挺耗费时间的,不知道有没有更好的方法了