1380. 矩阵中的幸运数
1.题目
给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小
在同一列的所有元素中最大
示例 1:
输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出:[15]
解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
示例 2:
输入:matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]]
输出:[12]
解释:12 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
2.参考答案
代码如下(示例):
class Solution:
def luckyNumbers(self, matrix: List[List[int]]) -> List[int]:
# 找出每一行的最小值
minrow = [min(row) for row in matrix]
# 找出每一列的最大值
maxcol = [max(col) for col in zip(*matrix)]
ans = []
for i,row in enumerate(matrix):
for j,x in enumerate(row):
if x == minrow[i] == maxcol[j]:
ans.append(x)
return ans
3.知识点
①列表表达式
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]
等价于
x = []
for 迭代变量 in 可迭代对象 :
if 条件表达式:
x.append(表达式)
#x 就是上面那个生成的列表
②enumerate() 函数
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
③zip()和zip(*) 函数
将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]