23.5.15 力扣每日一题:1072
题干
给定 m * n 矩阵的 matrix。
你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。)
返回经 过一些翻转后,行与行之间所有值都相等的最大行数。
示例1:
输入:matrix = [[0,1],[1,1]]
输出:1
解释:不进行翻转,有 1 行所有值都相等。
示例 2:
输入:matrix = [[0,1],[1,0]]
输出: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 ] == 0 或 1
解题思路:
其实看这道题,先从目标当中找共同点。如果有两行在翻转后,行内的数字都相等,那我们可以把它称之为相等行。
根据定义,相等行有两种,如下所示:
1)本身就相等的相等行,例如 1001 和 1001。
2)经过翻转后相等的相等行,例如1001 和0110。
因此,这样解题:
(1)首先我们将所有行的首位都进行统一,统一成 0 或者 统一成 1 都可以。这里选择统一成 0。
(2)将新矩阵的每一行转化成由0 和 1组成的字符串,随后统计相同的字符串数量,相同字符串的最大值,就是最后所要求的数。
我的代码实现:(一看就是初学者…)
class Solution:
def maxEqualRowsAfterFlips(self, matrix: List[List[int]]) -> int:
for line in matrix:
if line[0] == 1:
for i in range(0, len(line)):
if line[i] == 0:
line[i] = 1
elif line[i] == 1:
line[i] = 0
ans = []
single_string = ""
for row in matrix:
for single in row:
single_string += str(single)
ans.append(single_string)
single_string = ""
cnt = Counter(ans)
return max(cnt.values())
优秀代码学习:学习自这里
class Solution:
def maxEqualRowsAfterFlips(self, matrix: List[List[int]]) -> int:
cnt = Counter()
for row in matrix:
t = tuple(row) if row[0] == 0 else tuple(x ^ 1 for x in row)
cnt[t] += 1
return max(cnt.values())