给你一个矩阵 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
如有问题,希望大家指出!!!