📅  最后修改于: 2023-12-03 14:55:01.453000             🧑  作者: Mango
给定一个$n\times m$的矩阵,矩阵的边界元素组成的序列可以是一个递增序列,求最长的递增序列长度。
我们可以分别从矩阵的四个边界向内部搜索。对于每个边界元素,我们可以使用最长递增子序列(LIS)求解从它开始的最长递增序列长度。最终答案即为四个边界中的最大长度。
def longestIncreasingPath(matrix):
if not matrix or not matrix[0]:
return 0
n, m = len(matrix), len(matrix[0])
lbound = [(i, 0) for i in range(n)] + [(0, j) for j in range(1, m)]
rbound = [(i, m - 1) for i in range(1, n)] + [(n - 1, j) for j in range(m)]
ubound = [(0, j) for j in range(m)] + [(i, 0) for i in range(1, n)]
dbound = [(n - 1, j) for j in range(1, m)] + [(i, m - 1) for i in range(n)]
def LIS(matrix, i, j):
if memo[i][j]:
return memo[i][j]
res = 1
for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
if 0 <= ni < n and 0 <= nj < m and matrix[ni][nj] > matrix[i][j]:
res = max(res, LIS(matrix, ni, nj) + 1)
memo[i][j] = res
return res
memo = [[0] * m for _ in range(n)]
res = 0
for i, j in lbound + rbound + ubound + dbound:
res = max(res, LIS(matrix, i, j))
return res
该算法时间复杂度为$O(nm)$,其中$n$和$m$分别为矩阵的行数和列数。
该算法空间复杂度为$O(nm)$,用于存储记忆化搜索中的子问题解。