Given an integer matrix, find the length of the longest increasing path.
From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).
Example 1:
Input: nums =
[
[9,9,4],
[6,6,8],
[2,1,1]
]
Output: 4
Explanation: The longest increasing path is [1, 2, 6, 9]
.
Example 2:
Input: nums =
[
[3,4,5],
[3,2,6],
[2,2,1]
]
Output: 4
Explanation: The longest increasing path is [3, 4, 5, 6]
. Moving diagonally is not allowed.
题目获取最大递增路径。
寻找到所有波谷作为起点,一轮一轮的向上走,寻找出最长的路径(反过来也可以)。这里做了一个小优化,每个格子记录了有多少个方向小于这个格子。这样可以只需要在最后一个方向走到这个格子上时开始执行这个格子的下一步,可以裁剪掉不必要的遍历。代码如下:
class Solution(object):
def longestIncreasingPath(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: int
"""
rowSize = len(matrix)
tmp = []
if rowSize == 0:
return 0
colSize = len(matrix[0])
for i in range(rowSize):
tmp.append([0]*colSize)
maxList = []
for i in range(rowSize):
for j in range(colSize):
t = 0
v = matrix[i][j]
if i > 0 and matrix[i-1][j] > v:
t += 1
if j > 0 and matrix[i][j-1] > v:
t += 1
if i < rowSize - 1 and matrix[i+1][j] > v:
t += 1
if j < colSize - 1 and matrix[i][j+1] > v:
t += 1
tmp[i][j] = t
if t == 0:
maxList.append((i,j))
ret = 0
while len(maxList) > 0:
nextList = []
for i,j in maxList:
v = matrix[i][j]
if i > 0 and matrix[i-1][j] < v:
tmp[i-1][j] -= 1
if tmp[i-1][j] == 0:
nextList.append([i-1,j])
if j > 0 and matrix[i][j-1] < v:
tmp[i][j-1] -= 1
if tmp[i][j-1] == 0:
nextList.append([i,j-1])
if i < rowSize - 1 and matrix[i+1][j] < v:
tmp[i+1][j] -= 1
if tmp[i+1][j] == 0:
nextList.append([i+1,j])
if j < colSize - 1 and matrix[i][j+1] < v:
tmp[i][j+1] -= 1
if tmp[i][j+1] == 0:
nextList.append([i,j+1])
maxList = nextList
ret += 1
return ret