很简单的一道题啊,DFS加自定义比较函数的priorityqueue
import queue
class Node:
def __init__(self, value, x, y):
self.value = value
self.x = x
self.y = y
# 按照value升序排列
def __lt__(self, other):
return self.value < other.value
class Solution:
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
row = len(matrix)
col = len(matrix[0])
dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]
dis = [[0 for i in range(col)] for j in range(row)]
q = queue.PriorityQueue()
# 遍历整个矩阵,按照值排序存储索引 O(n^2 logn)
for i in range(row):
for j in range(col):
q.put(Node(matrix[i][j], i, j))
result = 1
def DFS(i, j):
nonlocal result
# print(i, j)
flag = False # 若还能更长则为True
for di in dirs:
tmpx = i+di[0]
tmpy = j+di[1]
if (tmpx >= 0 and tmpx < row) and (tmpy >= 0 and tmpy < col):
if matrix[tmpx][tmpy] > matrix[i][j] and dis[tmpx][tmpy] < dis[i][j]+1:
flag = True
dis[tmpx][tmpy] = dis[i][j]+1
DFS(tmpx, tmpy)
if not flag:
result = max(result, dis[i][j])
while not q.empty():
head = q.get()
v, x, y = head.value, head.x, head.y
if dis[x][y] == 0:
dis[x][y] = 1
DFS(x, y)
return result