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

📅  最后修改于: 2023-12-03 15:41:01.777000             🧑  作者: Mango

矩阵中的最长递增路径

介绍

在给定的矩阵中,找到一条最长的递增路径,这条路径可以从任何一个起点开始,移动到相邻的位置(上、下、左或右),若下一个位置的值比当前位置的值大,则可以继续移动;若下一个位置的值不比当前位置的值大,则路径结束。

示例

输入:

matrix = [
  [9,9,4],
  [6,6,8],
  [2,1,1]
]

输出:4

解释:最长的递增路径是 [1, 2, 6, 9]。

算法

本题可以使用动态规划,其状态转移方程如下:

$$ dp[i][j] = max(dp[i + 1][j], dp[i - 1][j], dp[i][j + 1], dp[i][j - 1]) $$

先从一个点出发,判断其相邻的四个方向是否可以继续递增,如果递增,则继续递归查找该点的下一步,如果不递增,则返回当前的长度,同时更新全局的最大路径长度。

代码

以下是Python3语言的代码实现,其中mem代表记忆化数组,用于存储已经计算过的结果,避免重复计算。

class Solution:
    def __init__(self):
        self.mem = []
        self.max_length = 0

    def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
        row, col = len(matrix), len(matrix[0])
        self.mem = [[0] * col for _ in range(row)]
        for i in range(row):
            for j in range(col):
                self.max_length = max(self.max_length, self.dfs(matrix, i, j))
        return self.max_length

    def dfs(self, matrix, i, j):
        if self.mem[i][j] != 0:
            return self.mem[i][j]
        row, col = len(matrix), len(matrix[0])
        dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
        length = 1
        for k in range(4):
            x, y = i + dx[k], j + dy[k]
            if 0 <= x < row and 0 <= y < col and matrix[x][y] > matrix[i][j]:
                length = max(length, 1 + self.dfs(matrix, x, y))
        self.mem[i][j] = length
        return length

以上是本题的解题思路和Python3语言的代码实现,时间复杂度为O(mn),其中m和n分别代表矩阵的行数和列数。