当前位置: 首页 > 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,

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

示例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. 解题思路

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

对应的思路如下:

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

  • Python版本:https://www.bilibili.com/cheese/play/ep1374920https://www.bilibili.com/cheese/play/ep1374920

  • Java版本:https://www.bilibili.com/cheese/play/ep1368184https://www.bilibili.com/cheese/play/ep1368184

  • Golang版本:https://www.bilibili.com/cheese/play/ep1365130https://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/ep1374920https://www.bilibili.com/cheese/play/ep1374920

  • Java版本:https://www.bilibili.com/cheese/play/ep1368184https://www.bilibili.com/cheese/play/ep1368184

  • Golang版本:https://www.bilibili.com/cheese/play/ep1365130https://www.bilibili.com/cheese/play/ep1365130

4.小结

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


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

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

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

  • Python编码实现:https://www.bilibili.com/cheese/play/ss897667807https://www.bilibili.com/cheese/play/ss897667807

  • Java编码实现:https://www.bilibili.com/cheese/play/ss161443488https://www.bilibili.com/cheese/play/ss161443488

  • Golang编码实现:https://www.bilibili.com/cheese/play/ss63997https://www.bilibili.com/cheese/play/ss63997

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

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


文章转载自:

http://IAoX4MUN.txLxr.cn
http://jWFzuMAB.txLxr.cn
http://5pZRWk9P.txLxr.cn
http://oNfX6cF5.txLxr.cn
http://eRsL5KN9.txLxr.cn
http://u3v4vyLd.txLxr.cn
http://UBhbvxre.txLxr.cn
http://VnbxIKPq.txLxr.cn
http://QLAIa0W7.txLxr.cn
http://rOYLWwtK.txLxr.cn
http://WazNunle.txLxr.cn
http://KuvoF8Ne.txLxr.cn
http://qZ3YP1GD.txLxr.cn
http://9UWcc6aY.txLxr.cn
http://tnLzGduT.txLxr.cn
http://4kjLdRet.txLxr.cn
http://5eJhpGpg.txLxr.cn
http://BK9rdx6b.txLxr.cn
http://6cPiKw5y.txLxr.cn
http://JR24MFGI.txLxr.cn
http://yWxb8wsP.txLxr.cn
http://lEbB7TP1.txLxr.cn
http://02mH6YwX.txLxr.cn
http://u9lLnMvf.txLxr.cn
http://m6jS30cN.txLxr.cn
http://J9sZFWMo.txLxr.cn
http://vGYWGpI3.txLxr.cn
http://XYswhccQ.txLxr.cn
http://cHhizMje.txLxr.cn
http://QIm4MywT.txLxr.cn
http://www.dtcms.com/a/377966.html

相关文章:

  • 4、幽络源微服务项目实战:后端公共模块创建与引入多租户模块
  • 用Next.js 构建一个简单的 CRUD 应用:集成 API 路由和数据获取
  • 如何通过url打开本地文件文件夹
  • Swagger隐藏入参中属性字段
  • JavaEE--8.网络编程
  • linux系统搭建nacos集群,并通过nginx实现负载均衡
  • 论文阅读:openai 2025 Why Language Models Hallucinate
  • Rail开发日志_9
  • opencv特征检测
  • 科普:环境隔离的工具:虚拟环境与容器Docker
  • 小迪安全v2023学习笔记(八十一讲)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE复现
  • ubuntu22.04 安装Docker
  • OpenCV 开发 -- 图像阈值处理
  • [Ubuntu][mount]ubuntu电脑挂载新硬盘
  • Maven中optional的作用
  • 使用pdfjs-dist 预览pdf,并添加文本层的实现
  • 操作系统应用开发(五)智能浏览器开发——东方仙盟元婴期
  • 蓝桥杯算法之基础知识(7)---排序题的快排和归并排序
  • leetcode-python-2154将找到的值乘以 2
  • Nginx 实战系列(十)—— LVS+Keepalived 高可用集群技术详解
  • C++ 前缀积 高频笔试考点 实用技巧 力扣 238.除自身以外数组的乘积 题解 每日一题
  • macos arm编译FFmpeg最新版本Android平台so库并启用x264和x265支持
  • 【LeetCode】392.判断子序列
  • StreamCap(直播录制) v1.0.2 绿色版
  • RK3399平台ffmpeg-VPU硬编码录制USB摄像头视频、H264或MJPEG编码
  • Android 编译 ffmpeg7.1.1
  • 什么是 源网荷储一体化和多能互补(光储充微电网解决方案)
  • SpringBoot集成ElasticSearch
  • STL库——AVL树
  • 构建实时消息应用:Spring Boot + Vue 与 WebSocket 的有机融合