给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 1:

输入: nums =

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

输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]。

示例 2:

输入: nums =

[[3,4,5],[3,2,6],[2,2,1]
]

输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

记忆化深度优先搜索

深度优先搜索是非常直观的方法。从一个单元格开始进行深度优先搜索,即可找到从该单元格开始的最长递增路径。对每个单元格分别进行深度优先搜索之后,即可得到矩阵中的最长递增路径的长度。

但是如果使用朴素深度优先搜索,时间复杂度是指数级,会超出时间限制,因此必须加以优化。

朴素深度优先搜索的时间复杂度过高的原因是进行了大量的重复计算,同一个单元格会被访问多次,每次访问都要重新计算。由于同一个单元格对应的最长递增路径的长度是固定不变的,因此可以使用记忆化的方法进行优化。

遍历完矩阵中的所有单元格之后,即可得到矩阵中的最长递增路径的长度。

Code

 def longestIncreasingPath(self, matrix: List[List[int]]) -> int:if not matrix:return 0rows, cols, ans = len(matrix), len(matrix[0]), 0dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]@lru_cache(None)def dfs(x, y):best = 1for dx, dy in dirs:nx, ny = x + dx, y + dyif -1 < nx < rows and -1 < ny < cols and matrix[nx][ny] > matrix[x][y]:best = max(best, dfs(nx, ny) + 1)return bestfor r in range(rows):for c in range(cols):ans = max(ans, dfs(r, c))return ans

复杂度分析

时间复杂度:O(mn),其中 m 和 n 分别是矩阵的行数和列数。深度优先搜索的时间复杂度是 O(V+E),其中 V 是节点数,E 是边数。在矩阵中,O(V)=O(mn),O(E)≈O(4mn)=O(mn)。

空间复杂度:O(mn),其中 m 和 n 分别是矩阵的行数和列数。空间复杂度主要取决于缓存和递归调用深度,缓存的空间复杂度是 O(mn),递归调用深度不会超过 mn。

329. Longest Increasing Path in a Matrix 矩阵中的最长递增路径相关推荐

  1. 329. 矩阵中的最长递增路径

    2020-06-09 1.题目描述 矩阵中的最长递增路径 2.题解 在这里我们可以将其视作有向图,如果当前的数比其四周位置上的数要小的话,就构建一条从当前数指向其 周围的边,要求得最长的递增路径,那么 ...

  2. java某个起点出发的最长路径_【leetcode-动态规划】矩阵中的最长递增路径

    [leetcode-动态规划]矩阵中的最长递增路径 题目: 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即 ...

  3. 矩阵中的最长递增路径

    矩阵中的最长递增路径 文章目录 矩阵中的最长递增路径 一.问题描述 **方法一:朴素的深度优先搜索 [超时]** **方法二:记忆化深度优先搜索 [通过]** **方法三:动态规划** **方法四:广 ...

  4. LeetCode 329. 矩阵中的最长递增路径(记忆化递归)

    文章目录 1. 题目 2. 解题 2.1 记忆化递归 2.2 拓扑排序 1. 题目 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向 ...

  5. 329 矩阵中的最长递增路径

    题目描述: 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: 输入: nums = ...

  6. 算法-------矩阵中的最长递增路径(Java版本)

    题目 给定一个整数矩阵,找出最长递增路径的长度.对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕).示例 1:输入: nums = [[9,9 ...

  7. leetcode329. 矩阵中的最长递增路径(dfs)

    给定一个整数矩阵,找出最长递增路径的长度.对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕).示例 1:输入: nums = [[9,9,4] ...

  8. leetcode329. 矩阵中的最长递增路径

    给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: 输入: nums =  [   ...

  9. Leetcode--329. 矩阵中的最长递增路径

    给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: 输入: nums =  [   ...

最新文章

  1. js获取asp.net服务器端控件Label,TextBox,RadioButtonList,DropDownList的值
  2. SQL:找出我(uid=2)所有的好友信息,和这些好友发布的最新的一篇文章
  3. Java中常见的代码冲突
  4. Linux IO复用区别与epoll详解
  5. 【NOIP2013】【Luogu1980】计数问题
  6. Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning
  7. Asp.net 无限级分类
  8. 删改数据如何避免锁表?等等,啥是锁呀
  9. INA226+STC89C52RC读取电流电压功率
  10. [维修案例] 艾美特电风扇(FS4085R)不能调风量维修
  11. 防雷知识:什么是雷电浪涌
  12. 【论文翻译】Cluster Contrast for Unsupervised Person Re-Identification(2021)
  13. 【Linux】文件的编码语系转换与换行符转换
  14. 光学指纹模组解锁方案设计指纹锁方案
  15. 存储系统——主存储器
  16. 《大唐豪侠》架构开发纪实
  17. 百度智能云的“星辰大海”
  18. zigbee 问题一:协调器究竟如何选择信道?
  19. foobar2000 1.1.10 用苹果新近开源的ALAC编码器很方便将APE、FLAC、WAV转无损m4a
  20. OCR:光学字符识别技术

热门文章

  1. ActiveMQ的介绍及使用实例.
  2. nginx代理人server结合tomcat采用
  3. python学习笔记(字典)
  4. 简单的Ajax应用实例
  5. 使用C语言将一个数组首尾互换后输出,函数实现体会地址传递
  6. typescript语法高亮插件_JavaScript开发者必备的10个Sublime Text插件
  7. 3.定义一个有10个元素的数组,用其代表10个学生的考试成绩,从键盘输入10个成绩,统计平均成绩。
  8. labview连接mysql数据库_labview使用DSN与数据库的连接包括access,mysql
  9. 三态门三个状态vhdl_人防门是什么?为什么会侵线导致重庆地铁事故
  10. PPS2013校园招聘笔试题