给定由若干 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;
    }
};