Leetcode 1198:找出所有行中最小公共元素(超详细的解法!!!)

给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了。请你帮忙找出在所有这些行中 最小的公共元素

如果矩阵中没有这样的公共元素,就请返回 -1

示例:

输入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]]
输出:5

提示:

  • 1 <= mat.length, mat[i].length <= 500
  • 1 <= mat[i][j] <= 10^4
  • mat[i] 已按递增顺序排列。

解题思路

这个由于数据量的问题,所以可以通过暴力的方式去做。也就是一次判断第一行中的数,在后面所有行中有没有出现。

class Solution:
    def smallestCommonElement(self, mat: List[List[int]]) -> int:
        r, c = len(mat), len(mat[0])
        for t in mat[0]:
            for i in range(1, r):
                for j in range(c):
                    if mat[i][j] == t:
                        break
                else:
                    break
            else:
                return t
        return -1

这里的python语法逻辑比较诡异,所以多看看吧!由于数组有序,所以我们可以通过lower_bound找对应元素是不是存在。关于lower_bound查看Leetcode 二分法问题总结(超详细!!!)

class Solution:
    def smallestCommonElement(self, mat: List[List[int]]) -> int:
        r, c = len(mat), len(mat[0])
        for i in range(c):
            for j in range(1, r):
                k = bisect.bisect_left(mat[j], mat[0][i])
                if mat[j][k] == mat[0][i]:
                    continue
                else:
                    break
            else:
                return mat[0][i]
        return -1

这个问题还有一个pythonic的解法,实际上我们可以将每一行的元素变成集合,然后所有集合交集的最小值就是我们的结果了。

from functools import reduce
class Solution:
    def smallestCommonElement(self, mat: List[List[int]]) -> int:
        res = reduce(operator. __and__, map(set, mat))
        return min(res) if res else -1

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值