1072. 按列翻转得到最大值等行数

85 阅读1分钟

题目:
给定 m x n 矩阵 matrix 。

你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。)

返回 经过一些翻转后,行与行之间所有值都相等的最大行数 。

算法:
方法一:hash table
思路:
矩阵1:
0 1
1 0

矩阵2:
0 1 0
1 0 1
0 1 0

矩阵3:
1 0 1
1 0 1
1 0 1
可以通过翻转列达到每行相等。
这两个矩阵的特征是什么?行a ^ 行b == 全1

func maxEqualRowsAfterFlips(matrix [][]int) int {
    ans := 0
    m := make(map[string]int)
    for i := range matrix {
        str := ""
        for j := range matrix[i] {
            if matrix[i][0] == 1 {
                str = str + fmt.Sprintf("%d", matrix[i][j] ^ 1)
            } else {
                str = str + fmt.Sprintf("%d", matrix[i][j])
            }
        }
        m[str] ++
        if m[str] > ans {
            ans = m[str]
        }
    }
    return ans
}

用字典树代替hash table也可以,关键是找到什么样的行能通过翻转列能使“行与行之间所有值相等”