每日一题——矩阵最长递增路径
矩阵最长递增路径问题
- 题目描述
- 数据范围:
- 进阶要求:
- 示例
- 示例 1
- 示例 2
- 题解思路
- 算法步骤:
- 代码实现
- 代码解释
- 复杂度分析
- 总结
题目描述
给定一个 n 行 m 列的矩阵 matrix,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径,使得这条路径上的元素是递增的。并输出这条最长路径的长度。
该路径必须满足以下条件:
- 对于每个单元格,你可以往上、下、左、右四个方向移动。不能在对角线方向上移动或移动到边界外。
- 你不能走重复的单元格。即每个格子最多只能走一次。
数据范围:
1 ≤ n, m ≤ 10000 ≤ matrix[i][j] ≤ 1000

进阶要求:
- 空间复杂度:
O(nm) - 时间复杂度:
O(nm)
示例
示例 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。
题解思路
这个问题可以通过 深度优先搜索(DFS)结合 动态规划(DP)来高效地解决。关键思路是:
- 深度优先搜索(DFS):我们可以对每个元素进行深度优先搜索,查找从该元素出发的最长递增路径。
- 动态规划(DP):我们可以在 DFS 搜索的过程中利用动态规划来避免重复计算相同位置的路径长度,从而提高效率。
算法步骤:
-
初始化:
- 创建一个
dp数组,记录每个位置的最长递增路径长度。 - 遍历每个单元格,使用 DFS 算法寻找每个单元格的最长路径。
- 创建一个
-
DFS 搜索:
- 对每个位置
(i, j),判断其四个邻接位置(上、下、左、右),如果邻接位置的值大于当前值,则递归搜索该邻接位置。 - 使用
dp[i][j]存储从(i, j)出发的最长递增路径,避免重复计算。
- 对每个位置
-
结果:
- 在遍历所有单元格后,
dp数组中的最大值即为矩阵中的最长递增路径。
- 在遍历所有单元格后,
代码实现
#include <stdio.h>
#include <stdlib.h>// 定义方向数组,表示上下左右四个方向
int directions[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};/*** 深度优先搜索(DFS)函数,用于计算从 (x, y) 开始的最长递增路径* * @param matrix 二维数组,表示矩阵* @param x 当前位置的行索引* @param y 当前位置的列索引* @param m 矩阵的行数* @param n 矩阵的列数* @param count 当前路径的长度* @return 从 (x, y) 开始的最长递增路径长度*/
int dfs(int** matrix, int x, int y, int m, int n, int count) {// 如果超出矩阵边界,返回当前路径长度if (x < 0 || x >= m || y < 0 || y >= n) {return count;}int maxPath = count; // 初始化当前最大路径长度为当前路径长度// 遍历四个方向for (int i = 0; i < 4; i++) {int nx = x + directions[i][0]; // 计算相邻位置的行索引int ny = y + directions[i][1]; // 计算相邻位置的列索引// 如果相邻位置超出矩阵边界,跳过if (nx < 0 || nx >= m || ny < 0 || ny >= n) {continue;}// 如果相邻位置的值小于当前位置的值,说明可以继续递增if (matrix[nx][ny] < matrix[x][y]) {// 递归调用 dfs,计算从相邻位置开始的路径长度int temp = dfs(matrix, nx, ny, m, n, count + 1);// 更新最大路径长度maxPath = maxPath > temp ? maxPath : temp;}}return maxPath; // 返回从 (x, y) 开始的最长递增路径长度
}/*** 主函数,计算矩阵中的最长递增路径* * @param matrix 二维数组,表示矩阵* @param matrixRowLen 矩阵的行数* @param matrixColLen 矩阵的列数* @return 矩阵中的最长递增路径长度*/
int solve(int** matrix, int matrixRowLen, int* matrixColLen) {// 如果矩阵为空或行数为0,返回0if (matrixRowLen == 0 || matrix == NULL) {return 0;}int m = matrixRowLen; // 矩阵的行数int n = matrixColLen[0]; // 矩阵的列数int maxLength = 0; // 初始化最长递增路径长度为0// 遍历矩阵的每个位置for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 从每个位置调用 dfs,计算从该位置开始的最长递增路径int pathLength = dfs(matrix, i, j, m, n, 1);// 更新最长递增路径的长度maxLength = maxLength > pathLength ? maxLength : pathLength;}}return maxLength; // 返回矩阵中的最长递增路径长度
}// 测试函数
int main() {// 定义一个示例矩阵int matrix[4][4] = {{9, 9, 4, 5},{6, 6, 8, 7},{2, 1, 1, 3},{3, 4, 2, 1}};int m = 4; // 矩阵的行数int n = 4; // 矩阵的列数// 将二维数组转换为指针数组int* matrixPtr[4];for (int i = 0; i < m; i++) {matrixPtr[i] = matrix[i];}// 定义列数数组int matrixColLen[4] = {n, n, n, n};// 调用 solve 函数,计算最长递增路径int maxLength = solve(matrixPtr, m, matrixColLen);// 打印结果printf("The longest increasing path length is: %d\n", maxLength);return 0;
}
代码解释
-
dp数组初始化:dp数组用于记录从每个单元格出发的最长递增路径。初始化时设置为-1,表示该位置尚未计算过。 -
DFS 函数:
dfs(i, j)是递归函数,用于计算从位置(i, j)开始的最长递增路径。- 首先检查
dp[i][j]是否已经计算过,如果计算过,则直接返回dp[i][j]。 - 否则,初始化最长路径为
1,即当前位置本身。 - 对于当前位置
(i, j),检查其四个邻接位置,如果邻接位置的值大于当前值,则递归计算该邻接位置的最长路径,并更新当前路径长度。 - 最终返回
dp[i][j]。
-
主函数:
- 遍历整个矩阵,对每个位置调用
dfs函数,并更新最大路径长度max_path。 - 最终返回最大路径长度。
- 遍历整个矩阵,对每个位置调用
复杂度分析
-
时间复杂度:
O(nm),每个位置最多计算一次。递归时,通过dp数组避免了重复计算。 -
空间复杂度:
O(nm),需要一个dp数组来存储每个位置的最长递增路径长度。
总结
这个问题使用 DFS 和动态规划的结合来有效地求解,避免了重复计算,提高了性能。通过合理使用 np 数组,我们可以确保每个位置的最长路径只计算一次,从而将时间复杂度降低到线性级别。
这题整体难度一般,和之前的求岛屿数量完全类似。但是仔细想想还是要多多注意,比如它还是要遍历整个数组,因为从任何路径走都是有可能的。另外幸好是单调递增,如果是单调非减的话就麻烦很多,因为单调非减会不停来回震荡,就很麻烦。
相关文章:
每日一题——矩阵最长递增路径
矩阵最长递增路径问题 题目描述数据范围:进阶要求:示例示例 1示例 2 题解思路算法步骤:代码实现代码解释复杂度分析总结 题目描述 给定一个 n 行 m 列的矩阵 matrix,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径&a…...
【CLIP系列】4:目标检测(ViLD、GLIP)
目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来,作者是把CLIP模型当成一个Teacher,去蒸馏他自己的网络,从而能Zero Shot去…...
Cesium for Unity Linux版本
Cesium for Unity 直装不支持Linux 参照官方开发流程一些操作命令issues 宝藏最后运行图 参照官方开发流程 https://github.com/CesiumGS/cesium-unity/blob/main/Documentation~/developer-setup.md 系统已经安装过dotnet和cmake xuefeixuefei:~$ dotnet --version 9.0.102 …...
Spring Boot过滤器链:从入门到精通
文章目录 一、过滤器链是什么?二、为什么需要过滤器链?三、Spring Boot中的过滤器链是如何工作的?(一)过滤器的生命周期(二)过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...
关于 IoT DC3 中驱动(Driver)的理解
在开源IoT DC3物联网系统中,驱动(Driver)扮演着至关重要的角色,它充当了软件系统与物理设备之间的桥梁。驱动的主要功能是依据特定的通信协议连接到设备,并根据设备模板中配置的位号信息进行数据采集和指令控制。不同的…...
微信小程序地图标记点,安卓手机一次性渲染不出来的问题
问题描述: 如果微信小程序端,渲染的标记物太多,安卓手机存在标记物不显示的问题,原因初步判断是地图还没有渲染完,标记物数据已经加载完了,导致没有在地图上显示。 解决办法: 使用map组件的b…...
一维差分与二维差分
差分(Difference)是一种与前缀和密切相关的技术,主要用于高效处理区间更新操作。差分数组的核心思想是通过记录相邻元素的差值来表示原数组的变化,从而将区间更新操作的时间复杂度从 O(n) 优化到 O(1)。下面详细讲解一维差分和二维…...
EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS
随着互联网技术的飞速发展,实时通信(RTC)已经成为现代应用中不可或缺的一部分。无论是视频会议、在线教育、远程医疗,还是社交娱乐,实时通信技术都在其中扮演着重要角色。 然而,WebRTC技术在PC和移动端的支…...
数据库脚本MySQL8转MySQL5
由于生产服务器版本上部署的是MySQL5,而开发手里的脚本代码是MySQL8。所以只能降版本了… 升级版本与降级版本脚本转换逻辑一样 MySQL5与MySQL8版本SQL脚本区别 大多数无需调整、主要是字符集与排序规则 MySQL5与MySQL8版本SQL字符集与排序规则 主要操作&…...
【PGCCC】commit_delay 对性能的提升:PostgreSQL 基准测试
通过禁用参数可以来调整事务工作负载synchronous_commit。该措施有惊人效果。但在操作系统崩溃期间丢失已提交事务的可能性使其成为许多应用程序无法启动的因素。因此我决定写下来。 WAL 刷新是事务数据库工作负载的瓶颈 为了确保已提交的事务不会丢失,PostgreSQL…...
AI大模型随机初始化权重并打印网络结构方法(以Deepseekv3为例,单机可跑)
背景 当前大模型的权重加载和调用,主要是通过在HuggingFace官网下载并使用transformer的库来加以实现;其中大模型的权重文件较大(部分>100GB),若只是快速研究网络结构和数据流变化,则无需下载权重。本文…...
字符串解码——巧妙使用递归解题
题目描述 给定一个经过编码的字符串,返回它解码后的字符串。编码规则为 k[encoded_string],表示方括号内部的 encoded_string 重复 k 次。其中 k 是正整数,输入字符串确保符合格式要求且无额外空格。 示例: 复制 示例 1&#…...
Flask Web开发的重要概念和示例
一口气列举Flask Web应用的所有概念和示例 Flask Web 应用基本框架 路由(Routing) 模版(Template) request 对象 JSON 数据处理 redirect 示例 文件上传示例 文件下载示例 Session 示例 Cookie操作 Flask Web 应用基本框架 这是一个 最基础的 Flask Web 应用,…...
51-ArrayList
51-ArrayList Collection 类型介绍 仓颉中常用的几种基础 Collection 类型,包含 Array、ArrayList、HashSet、HashMap。 可以在不同的场景中选择适合对应业务的类型: Array:如果不需要增加和删除元素,但需要修改元素ÿ…...
Ollama+WebUI+DeepSeek部署自己的本地大模型
前言 使用AI几乎成为互联网工作者必备技能了,DeepSeek的出现把AI再次推向高潮,在本文中,我们将带领大家借助 Ollama、WebUI 和 deepseek 这三个工具,成功搭建属于自己的本地大模型环境。Ollama 作为一款轻量级的大模型运行工具&a…...
(篇六)基于PyDracula搭建一个深度学习的软件之新版本ultralytics-8.3.28调试
ultralytics-8.3.28版本debug记录 1传入文件 代码太多不粘贴在这里了,完整代码写在了篇三 def open_src_file(self):config_file config/fold.jsonconfig json.load(open(config_file, r, encodingutf-8))open_fold config[open_fold]if not os.path.exists(op…...
NLP Word Embeddings
Word representation One-hot形式 在上一周介绍RNN类模型时,使用了One-hot向量来表示单词的方式。它的缺点是将每个单词视为独立的,算法很难学习到单词之间的关系。 比如下面的例子,即使语言模型已经知道orange juice是常用组合词…...
基于 FPGA 的嵌入式系统硬件逻辑优化技术探究
在数字化浪潮席卷全球的当下,嵌入式系统已然成为众多领域不可或缺的核心力量。从我们日常使用的智能手机、智能穿戴设备等消费电子产品,到关乎工业生产效率与精度的工业控制系统,再到汽车电子领域的自动驾驶辅助系统以及航空航天领域的飞行器…...
使用HX搭建UNI-APP云开发项目(适合新手小白与想学云开发的宝子)
什么是uni-app云开发 uni-app云开发是uni-app提供的一套后端服务,它可以帮助开发者快速搭建起一个完整的后端服务,包括数据库、云函数、存储等。开发者只需要关注前端页面的开发,后端服务由uni-app云开发提供。 uni-app云开发的优势: 快速搭建后端服务:uni-app云开发提供了…...
sql:时间盲注和boolen盲注
关于时间盲注,boolen盲注的后面几个获取表、列、具体数据的函数补全 时间盲注方法 import time import requests# 获取数据库名 def inject_database(url):dataname for i in range(1, 20):low 32high 128mid (low high) // 2while low < high:payload &q…...
【STM32】ADC|多通道ADC采集
本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…...
arcgis for js实现层叠立体效果
在 Web 开发中,利用 ArcGIS for JS 实现一些炫酷的地图效果能够极大地提升用户体验。本文将详细介绍如何使用 ArcGIS for JS 实现层叠立体效果,并展示最终的效果图。 效果图 实现思路 要实现层叠立体效果,关键在于获取边界图形的坐标…...
多模态本地部署和ollama部署Llama-Vision实现视觉问答
文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…...
【DeepSeek】deepseek可视化部署
目录 1 -> 前文 2 -> 部署可视化界面 1 -> 前文 【DeepSeek】DeepSeek概述 | 本地部署deepseek 通过前文可以将deepseek部署到本地使用,可是每次都需要winR输入cmd调出命令行进入到命令模式,输入命令ollama run deepseek-r1:latest。体验很…...
【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 相关笔记: https://blog.csdn.net/dj…...
Fabric.js、leaferjs、pixi.js 库的对比分析
文章目录 一、引言二、参与对比的 canvas 库简介三、性能对比四、易用性对比五、功能特性对比六、综合评价与使用建议七、总结 在前端开发中,canvas 库为实现丰富的图形效果和交互功能提供了强大的支持。本文将对 Fabric.js、leaferjs 和 pixi.js 这三个常见的 canv…...
JVM——堆的回收:引用计数发和可达性分析法、五种对象引用
目录 引用计数法和可达性分析法 引用计数法: 可达性分析算法: 五种对象引用 软引用: 弱引用: 引用计数法和可达性分析法 引用计数法: 引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1&…...
2.11 sqlite3数据库【数据库的相关操作指令、函数】
练习: 将 epoll 服务器 客户端拿来用 客户端:写一个界面,里面有注册登录 服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确…...
开源模型应用落地-Qwen1.5-MoE-A2.7B-Chat与vllm实现推理加速的正确姿势(一)
一、前言 在人工智能技术蓬勃发展的当下,大语言模型的性能与应用不断突破边界,为我们带来前所未有的体验。Qwen1.5-MoE-A2.7B-Chat 作为一款备受瞩目的大语言模型,以其独特的架构和强大的能力,在自然语言处理领域崭露头角。而 vllm 作为高效的推理库,为模型的部署与推理提…...
相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景
在当今快速发展的科技领域,低代码一体化平台已成为企业数字化转型的关键工具,同时,大型语言模型(LLM)如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器,目前…...
