📜  矩阵中最长的增长路径(1)

📅  最后修改于: 2023-12-03 14:56:29.514000             🧑  作者: Mango

矩阵中最长的增长路径

介绍

给定一个矩阵,找到其中最长的递增路径。递增路径定义为从左上角开始,每一个相邻的元素都比前一个元素大的路径。

解法

此问题可以用动态规划来解决。我们可以维护一个二维数组 dp,其中 dp[i][j] 表示以位置 (i, j) 为起点时最长的递增路径的长度。然后我们遍历整个矩阵,对于每个位置 (i, j),从其上方、下方、左侧、右侧四个位置中找到一个比当前位置大的位置,然后将其 dp 值加 1。维护一个变量 res 来记录所有 dp 值中的最大值,最后返回 res

def longestIncreasingPath(matrix):
    if not matrix:
        return 0
    
    m, n = len(matrix), len(matrix[0])
    dp = [[0 for _ in range(n)] for _ in range(m)]
    
    def dfs(i, j, matrix, dp):
        if dp[i][j] != 0:
            return dp[i][j]
        directions = [(0, -1), (-1, 0), (0, 1), (1, 0)]
        currMax = 1
        for d in directions:
            row, col = i + d[0], j + d[1]
            if row >= 0 and row < m and col >= 0 and col < n:
                if matrix[row][col] > matrix[i][j]:
                    nextMax = 1 + dfs(row, col, matrix, dp)
                    currMax = max(currMax, nextMax)
        dp[i][j] = currMax
        return currMax
    
    res = 0
    for i in range(m):
        for j in range(n):
            currMax = dfs(i, j, matrix, dp)
            res = max(res, currMax)
    return res
性能分析

暴力解法的时间复杂度为 $O(4^{mn})$,空间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为矩阵的行数和列数。优化后的时间复杂度为 $O(mn)$,空间复杂度为 $O(mn)$。