Keshawn_lu's Blog

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

字数统计: 357阅读时长: 1 min
2023/05/15 Share

题目简介:

给定 m x n 矩阵 matrix

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

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

示例 1:

1
2
3
输入:matrix = [[0,1],[1,1]]
输出:1
解释:不进行翻转,有 1 行所有值都相等。

示例 2:

1
2
3
输入:matrix = [[0,0,0],[0,0,1],[1,1,0]]
输出:2
解释:翻转前两列的值之后,后两行由相等的值组成。

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j] == 01

思路:

这题的本质是找等价行最多的数量,那什么是等价行呢:如11000011这种可以通过翻转得到相等结果的值便是等价行。

所以我们遍历每一行,将它们都转成0开头的字符串,并通过哈希表存储。

最后数量最多的等价行便是答案。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {

unordered_map<string, int> map;

int res = 0;
int flag;
for(int i = 0; i < matrix.size(); ++i){

if(matrix[i][0] == 1)
flag = 1;
else
flag = 0;

string s;
for(int j = 0; j < matrix[i].size(); ++j){

if(flag == 1)
s += (matrix[i][j] == 1 ? '0' : '1');
else
s += to_string(matrix[i][j]);
}

res = max(res, ++map[s]);
}

return res;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: