给定由若干 0 和 1 组成的矩阵 matrix,从中选出任意数量的列并翻转其上的 每个 单元格。翻转后,单元格的值从 0 变成 1,或者从
1 变为 0 。回经过一些翻转后,行与行之间所有值都相等的最大行数。
示例 1:
输入:[[0,1],[1,1]]
输出:1
解释:不进行翻转,有 1 行所有值都相等。
示例 2:
输入:[[0,1],[1,0]]
输出:2
解释:翻转第一列的值之后,这两行都由相等的值组成。
示例 3:
输入:[[0,0,0],[0,0,1],[1,1,0]]
输出:2
解释:翻转前两列的值之后,后两行由相等的值组成。
思路:
如果通过转换n列可以使行上每个数相等,则这些行
1)完全按位相等,
2)完全按位相反
如:
001
110
001
因此,我们可以把每行进行映射统计:
1)0开头的不变
2)1开头的全部取反
在map中统计个数,个数最大的则为结果
作者:gao-yue-ran
链接:https://leetcode-cn.com/problems/flip-columns-for-maximum-number-of-equal-rows/solution/1072-an-lie-fan-zhuan-de-dao-zui-da-zhi-deng-xin-2/
class Solution {
public:
int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
map<vector<int>,int>ans;
for(auto row: matrix){
if(row[0]==0){ //0开头不变
ans[row]++;
}
else{
vector<int> temp;
for(auto& x:row){
temp.push_back(!x); //1开头取反
}
ans[temp]++;
}
}
int result=0;
for(auto a:ans){
result=max(a.second,result);
}
return result;
}
};