当前位置: 首页 > news >正文

可视化图解算法60:矩阵最长递增路径

牛客网 面试笔试 TOP101

1. 题目

描述

给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。

这个路径必须满足以下条件:

  1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。

  2. 你不能走重复的单元格。即每个格子最多只能走一次。

数据范围:1≤n,m≤1000,0 ≤matrix [i] [j]≤1000

进阶:空间复杂度 O(nm) ,时间复杂度 O(nm)

例如:当输入为[[1,2,3],[4,5,6],[7,8,9]]时,对应的输出为5,

其中的一条最长递增路径如下图所示:

BM61

示例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

2. 解题思路

首先,我们需要明确题目的要求:

60-1

对应的思路如下:

60-2

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:https://www.bilibili.com/cheese/play/ep1374920
  • Java版本:https://www.bilibili.com/cheese/play/ep1368184
  • Golang版本:https://www.bilibili.com/cheese/play/ep1365130

3. 编码实现

核心代码如下:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 递增路径的最大长度* @param matrix int整型二维数组 描述矩阵的每个数* @return int整型*/
func solve(matrix [][]int) int {// write code heremaxMat = newArray(len(matrix), len(matrix[0]))maxValue := 0 //最长路径for i := 0; i < len(matrix); i++ {for j := 0; j < len(matrix[i]); j++ {//二维数组中的每一个点都可能是最大路径的起始点preMax := dfs(matrix, i, j, -1)maxValue = max(maxValue, preMax)}}return maxValue
}var (// 如果我们已经知道以该点为头的最长递增路径长度,那么在dfs查找时可以直接使用这个长度,而无需再次计算.// 用一个矩阵将已经计算得到的最长递增路径进行存储maxMat [][]int
)// 以坐标(i,j)为起始点的最长路径
func dfs(mat [][]int, i int, j int, pre int) int {//2.递归终止条件:不是递增,直接返回if mat[i][j] <= pre {return 0}//3.剪枝:如果该点已经计算过,直接返回,不用再重新计算if maxMat[i][j] != 0 {return maxMat[i][j]}maxVal := 0// 1. 递归步骤//1.1 向左if i > 0 {//用 mat[i][j] 作为 pre,去比较其左侧的数据perMax := dfs(mat, i-1, j, mat[i][j])maxVal = max(maxVal, perMax)}//1.2 向右if i < len(mat)-1 {//用 mat[i][j] 作为 pre,去比较其右侧的数据perMax := dfs(mat, i+1, j, mat[i][j])maxVal = max(maxVal, perMax)}//1.3 向上if j > 0 {//用 mat[i][j] 作为 pre,去比较其上侧的数据perMax := dfs(mat, i, j-1, mat[i][j])maxVal = max(maxVal, perMax)}//1.4 向下if j < len(mat[i])-1 {//用 mat[i][j] 作为 pre,去比较其下侧的数据perMax := dfs(mat, i, j+1, mat[i][j])maxVal = max(maxVal, perMax)}maxMat[i][j] = maxVal + 1 //最长路径:上下左右最长的路径+1(当前的点)return maxMat[i][j]
}
func max(a, b int) int {if a >= b {return a}return b
}func newArray(row, column int) [][]int {arr := make([][]int, row)for i := 0; i < row; i++ {arr[i] = make([]int, column)}return arr}

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:https://www.bilibili.com/cheese/play/ep1374920
  • Java版本:https://www.bilibili.com/cheese/play/ep1368184
  • Golang版本:https://www.bilibili.com/cheese/play/ep1365130

4.小结

矩阵的最长递增路径通过遍历+递归的思想完成。对二维数组中的每一个位置查找最长递增路径。对于每一个点(i,j)来说,分别向上、向下、向左、向右寻找最长递增路径。为了减少递归调用的次数,用一个二维数组maxMat来保留每个点对应的最长递增路径。

分割线

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:https://www.bilibili.com/cheese/play/ss897667807
  • Java编码实现:https://www.bilibili.com/cheese/play/ss161443488
  • Golang编码实现:https://www.bilibili.com/cheese/play/ss63997

对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:奇文共欣赏,疑义相与析。

http://www.sczhlp.com/news/90808/

相关文章:

  • 灵码产品演示:软件工程架构分析
  • 学网站开发有前途吗撰写网站策划书
  • 扩展 Min-Max 容斥
  • 网站开发要哪些黑龙江网络公司网站建设
  • 手机网站优点7k7k传奇世界网页版
  • 设计深圳网站制作windows优化大师win10
  • wordpress客户端建站wordpress如何迁移
  • 营销型企业网站核心推荐个2021能看的网站免费
  • 聚美优品返利网站怎么做wordpress移动端 菜单
  • 农产品网站建设及优化项目西安网站开发制作
  • 网络推广发帖网站wordpress搭建超详细
  • 网站建设电话着么打备案名称和网站logo不一致
  • 吴中区做网站做网站好的网站建设公司
  • 北京市推进中小学人工智能教育工作方案(2025—2027年)
  • IvorySQL 适配 LoongArch 龙架构
  • Gitlab-ee v18.1.1 破解
  • 网站建设怎么自学id设计
  • 丹阳网站建设机构供求信息网站开发背景
  • 遵义网站建设网帮你站酷的网址
  • 专业的手机价格网站建设网站开发团队要几个人
  • 做高端品牌生产商的网站网页做网站的尺寸
  • 网站开发 前端 外包深圳网站推广优化培训
  • 网站建设哪公司好企点qq售卖平台
  • MySQL查询助手!嘎嘎好用
  • 题解:P13979 数列分块入门 4
  • 常州网站建设外包抖音网红代运营
  • 网站服务器要多少钱wordpress如何去掉加密保护
  • 汕头网站制作专业许昌市做网站公司
  • 网站开发选择什么软件焦作app网站建设
  • 网站栏目 英文南京网络推广