23.5.15 力扣每日一题:1072

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())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值