📜  数组边界元素的最长递增序列(1)

📅  最后修改于: 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)$,用于存储记忆化搜索中的子问题解。