题目:
给你一个下标从 0 开始、大小为 m x n 的矩阵 grid ,矩阵由若干 正 整数组成。
你可以从矩阵第一列中的 任一 单元格出发,按以下方式遍历 grid :
- 从单元格
(row, col)可以移动到(row - 1, col + 1)、(row, col + 1)和(row + 1, col + 1)三个单元格中任一满足值 严格 大于当前单元格的单元格。
返回你在矩阵中能够 移动 的 最大 次数。
思考:
第一列每个数作为起点,判断下一列中相邻的三个数是否符合条件“大于起点” ----> 若符合条件,则以该数作为起点,继续判断下一列......
因此,用一个集合表示每一步的起点,另一个集合表示每一步符合条件的终点,按列遍历矩阵。
若到某一列时,没有符合条件的数,则返回已经走过的步数,即已遍历过的列数(=当前列的下标)减一。
若完整遍历了整个矩阵,则步数为总列数n减一。
代码如下:
class Solution(object):
def maxMoves(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m = len(grid) # 行数
n = len(grid[0]) # 列数
q = set(range(m))
# 集合q表示每一步的所有起点,把矩阵第一列全部加入集合
for i in range(1, n): # 从第二列起遍历
q2 = set() # q2表示每一步符合条件的终点
for j in q: # 对每个起点计算其下一步
for x in [j-1, j, j+1]:
if 0 <= x < m and grid[x][i] > grid[j][i-1]:
q2.add(x)
if not q2: # 若没有符合条件的下一步,则返回之前已经走的步数
return i - 1
q = q2 # 所有符合条件的终点即为下一步的起点
# 循环正常结束,说明走过了全部列
return n - 1
运行通过:

ps:关于python中对集合的操作add()
自动判断:若添加的值已存在于集合中,则不进行操作,否则加入集合。不用自己手动判断噢
文章描述了一种算法,通过遍历给定的矩阵,从第一列的任意数开始,按照规则移动到下一个符合条件的单元格,计算在矩阵中能移动的最大次数。使用Python实现时利用集合存储起点和符合条件的终点,直到遍历完整个矩阵。
842

被折叠的 条评论
为什么被折叠?



