题目:
给你一个下标从 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()
自动判断:若添加的值已存在于集合中,则不进行操作,否则加入集合。不用自己手动判断噢