首页 > 试题广场 >

矩阵最长递增路径

[编程题]矩阵最长递增路径
  • 热度指数:52810 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。
这个路径必须满足以下条件:

1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
2. 你不能走重复的单元格。即每个格子最多只能走一次。

数据范围:
进阶:空间复杂度 ,时间复杂度

例如:当输入为[[1,2,3],[4,5,6],[7,8,9]]时,对应的输出为5,
其中的一条最长递增路径如下图所示:

示例1

输入

[[1,2,3],[4,5,6],[7,8,9]]

输出

5

说明

1->2->3->6->9即可。当然这种递增路径不是唯一的。       
示例2

输入

[[1,2],[4,3]]

输出

4

说明

 1->2->3->4   

备注:
矩阵的长和宽均不大于1000,矩阵内每个数不大于1000
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 递增路径的最大长度
# @param matrix int整型二维数组 描述矩阵的每个数
# @return int整型
#
class Solution:
    def solve(self , mat: List[List[int]]) -> int:
        # write code here
        dirs = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        def dfs(i, j):
            if memo[i][j] > 0 : return memo[i][j]
            memo[i][j] = 1
            for dir in dirs:
                x, y = i + dir[0], j + dir[1]
                if x < 0&nbs***bsp;x >= len(mat)&nbs***bsp;y < 0&nbs***bsp;y >= len(mat[0])&nbs***bsp;mat[x][y] <= mat[i][j]: continue
                memo[i][j] = max(memo[i][j], dfs(x, y) + 1)
            return memo[i][j]
        m, n, ans = len(mat), len(mat[0]), 0
        memo = [[0] * n for _ in range(m)] 
        for i in range(len(mat)):
            for j in range(len(mat[0])):
                ans = max(ans, dfs(i, j))
        return ans

发表于 2022-11-12 17:32:10 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 递增路径的最大长度
# @param matrix int整型二维数组 描述矩阵的每个数
# @return int整型
#
class Solution:
    def maxDist(self, matrix: List[List[int]], dist: List[List[int]], x: int, y: int):
        left, right, down, up = 0, 0, 0, 0
        if dist[x][y] > 0:
            return dist[x][y]
        if y > 0 and matrix[x][y] < matrix[x][y-1]:
            left = self.maxDist(matrix, dist, x, y-1) + 1
        if y < len(dist[0]) - 1 and matrix[x][y] < matrix[x][y + 1]:
            right = self.maxDist(matrix, dist, x, y+1) + 1
        if x > 0 and matrix[x][y] < matrix[x-1][y]:
            up = self.maxDist(matrix, dist, x-1, y) + 1
        if x < len(dist) - 1 and matrix[x][y] < matrix[x+1][y]:
            down = self.maxDist(matrix, dist, x+1, y) + 1
        dist[x][y] = max(left, right, down, up, 1)
        return dist[x][y]

    def solve(self , matrix: List[List[int]]) -> int:
        row, col = len(matrix), len(matrix[0])
        dist = [[0]*col for _ in range(row)]
        ret = 0
        for i in range(row):
            for j in range(col):
                if dist[i][j] == 0:
                    self.maxDist(matrix, dist, i, j)
                ret = max(ret, dist[i][j])
        return ret

发表于 2022-10-05 21:48:47 回复(0)