力扣每日一题-2373矩阵中的局部最大值 python一行解析
题目
思路
- 利用python里面的生成器可以快速解决这个问题
- 首先我们要生成一个矩阵,这个矩阵里面的元素个数为 ( n − 2 ) × ( n − 2 ) (n-2)\times(n-2) (n−2)×(n−2)个,我们可以先写一个生成器
[[ max(F(grid(i, j)) for y in range(1, len(grid) - 1)] for x in range(1, len(grid) - 1)]
注意,这里的
F
(
g
r
i
d
(
i
,
j
)
)
F(grid(i, j))
F(grid(i,j))用来表示以
(
i
,
j
)
(i, j)
(i,j)为中心的局部矩阵,无法直接运行,这样我们可以构造出一个答案所需要的二维矩阵的结构,下一步我们要找到这个局部矩阵
F
(
g
r
i
d
(
i
,
j
)
)
F(grid(i, j))
F(grid(i,j))
3. 接着,我们构造局部矩阵,按照题目意思,局部矩阵即当前中心左上到右下角的所有元素顺序构成的一个二维矩阵,所以不难发现可以这样构造局部矩阵
F
(
g
r
i
d
(
i
,
j
)
)
F(grid(i, j))
F(grid(i,j))
[grid[i][j] for i in range(x-1, x+2) for j in range(y-1, y+2)]
这样其实我们直接得到了上述局部矩阵的一维展开形式
4. 我们对这个列表求最值,可以得到我们需要的局部矩阵的最值,最后把这些最值放入最开始生成的二维列表中即得到题目所需
代码
class Solution:
def largestLocal(self, grid: List[List[int]]) -> List[List[int]]:
return([[max([grid[i][j] for i in range(x - 1, x + 2) for j in range(y - 1, y + 2)]) for y in range(1, len(grid) - 1)] for x in range(1, len(grid) - 1)])
总结
- 一行解决问题有时候并不是最开始就用一行的思想,而是一步一步写出解答最后简化过程,比如这题先找到的其实是局部矩阵,然后对矩阵展开,然后求最值,最后构造二维矩阵。
- 写项目时尽量不要这样写,降低了可读性,这样主要是为了锻炼下思维。
以上, 共勉