C++算法:矩阵中的最长递增路径

涉及知识点

拓扑排序

题目

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
示例 1:
输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。
示例 2:
输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。
示例 3:

输入:matrix = [[1]]
输出:1
参数范围
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 231 - 1

2023年一月版

class Solution {
public:
int longestIncreasingPath(vector<vector>& matrix) {
m_r = matrix.size();
m_c = matrix[0].size();
m_dp.assign(m_r, vector(m_c, -1));
std::map<int,vector<pair<int,int>>> mVRC;
for (int r = 0; r < m_r; r++)
{
for (int c = 0; c < m_c; c++)
{
mVRC[matrix[r][c]].emplace_back(r, c);
}
}
for (auto& it : mVRC)
{
for (auto& rc : it.second)
{
m_dp[rc.first][rc.second] = Test(matrix, rc.first, rc.second);
}
}
int iMax = 0;
for (int r = 0; r < m_r; r++)
{
for (int c = 0; c < m_c; c++)
{
iMax = max(iMax, m_dp[r][c]);
}
}
return iMax;
}
int Test(const vector<vector>& matrix,int r, int c)
{
int iMax = 0;
if ((r > 0) && (matrix[r][c] > matrix[r - 1][c]))
{
iMax = max(iMax,m_dp[r-1][c] );
}
if ((r +1 < m_r ) && (matrix[r][c] > matrix[r + 1][c]))
{
iMax = max(iMax, m_dp[r + 1][c]);
}
if ((c > 0) && (matrix[r][c] > matrix[r][c-1]))
{
iMax = max(iMax, m_dp[r][c-1]);
}
if ((c + 1 < m_c) && (matrix[r][c] > matrix[r][c + 1]))
{
iMax = max(iMax, m_dp[r][c + 1]);
}
return iMax + 1;
}
int m_r;
int m_c;
vector<vector> m_dp;
};

2023年8月版

class Solution {
public:
int longestIncreasingPath(vector<vector>& matrix) {
m_r = matrix.size();
m_c = matrix.front().size();
m_iMaskNum = m_r * m_c;
//生成邻接表
vector<vector> vNeiBo(m_iMaskNum);
vector vInDeg(m_iMaskNum);
for (int r = 0; r < m_r; r++)
{
for (int c = 0; c < m_c; c++)
{
auto Add = [this,&matrix, &vNeiBo,&vInDeg](int curMask, int curValue, int r, int c)
{
if ((r < 0) || (r >= m_r))
{
return;
}
if ((c < 0) || (c >= m_c))
{
return;
}
if (curValue > matrix[r][c])
{
vNeiBo[r * m_c + c].emplace_back(curMask);
vInDeg[curMask]++;
}
};
Add(r * m_c + c, matrix[r][c], r + 1, c);
Add(r * m_c + c, matrix[r][c], r - 1, c);
Add(r * m_c + c, matrix[r][c], r, c + 1);
Add(r * m_c + c, matrix[r][c], r, c - 1);
}
}
//top排序
queue que;
vector vLen(m_iMaskNum, 0);
for (int i = 0; i < m_iMaskNum; i++)
{
if (0 == vInDeg[i])
{
que.emplace(i);
vLen[i] = 1;
}
}
while (que.size())
{
const int cur = que.front();
que.pop();
for (const auto& next : vNeiBo[cur])
{
if (–vInDeg[next] == 0)
{
vLen[next] = vLen[cur] + 1;
que.emplace(next);
}
}
}
return *std::max_element(vLen.begin(), vLen.end());
}
int m_r;
int m_c;
int m_iMaskNum;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

| 洒家想对大家说的话
|
|-|
|闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。|
| 墨家名称的来源:有所得以墨记之。 |
|如果程序是一条龙,那算法就是他的是睛|

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境:

VS2022 C++17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176320.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试经典(6/150)轮转数组

面试经典&#xff08;6/150&#xff09;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 以下为自己的思路&#xff0c;我不明白最终的返回值为什么有误&#xff0c;好像是题目里要求原地解决问题&#xff0c;而我创…

如何把小米路由器刷入OpenWRT系统并通过内网穿透工具实现公网远程访问

小米路由器4A千兆版刷入OpenWRT并远程访问 文章目录 小米路由器4A千兆版刷入OpenWRT并远程访问前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理…

解析数据洁净之道:BI中数据清理对见解的深远影响

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 随着数字化和信息化进程的不断发展&#xff0c;数据已经成为企业的一项不可或缺的重要资源。然而&#xff0c;这…

手把手带你学习 JavaScript 的 ES6 ~ ESn

文章目录 一、引言二、了解 ES6~ESn 的新特性三、掌握 ES6~ESn 的用法和实现原理四、深入挖掘和拓展《深入理解现代JavaScript》编辑推荐内容简介作者简介精彩书评目录 一、引言 JavaScript 是一种广泛使用的网络编程语言&#xff0c;它在前端开发中扮演着重要角色。随着时间的…

实战leetcode(二)

Practice makes perfect&#xff01; 实战一&#xff1a; 这里我们运用快慢指针的思想&#xff0c;我们的slow和fast都指向第一个节点&#xff0c;我们的快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;当我们的fast指针走到尾的时候&#xff0c;我们的慢指针正好…

Python接口测试框架选择之pytest+yaml+Allure!

一、为什么选择pytest&#xff1f; pytest完全兼容python自带的unittest pytest让单元测试更简单&#xff0c;能很好的管理测试用例。 对于实现接口测试的复杂场景&#xff0c;pytest的fixture、PDB等高阶用法都能实现需求。 入门简单&#xff0c;对于代码基础薄弱的团队人…

基于单片机智能浇花系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机智能浇花系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能浇花系统可以实现自动化浇水、测土湿度和温度等功能&#xff0c;以下是一个基本的仿真设计步骤&am…

安全区域边界(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1边界防护 1.1应保证跨…

JavaScript从入门到精通系列第三十七篇:详解JavaScript中文档的加载顺序

文章目录 一&#xff1a;文档加载说明 1&#xff1a;回顾一个代码 2&#xff1a;问题分析和说明 二&#xff1a;如何给JS换个位置&#xff1f; 1&#xff1a;过程分析 2&#xff1a;代码编写 3&#xff1a;运行结果 4&#xff1a;解释说明 大神链接&#xff1a;作者有幸…

Redis 事务是什么?又和MySQL事务有什么区别?

目录 1. Redis 事务的概念 2. Redis 事务和 MySQL事务的区别&#xff1f; 3. Redis 事务常用命令 1. Redis 事务的概念 下面是在 Redis 官网上找到的关于事务的解释&#xff0c;这里划重点&#xff0c;一组命令&#xff0c;一个步骤。 也就是说&#xff0c;在客户端与 Redi…

【QT系列教程】之二创建项目和helloworld案例

文章目录 一、QT创建项目1.1、创建项目1.2、选择创建项目属性1.3、选择路径和项目名称1.4、选择构建项目类型1.5、布局方式1.6、翻译文件&#xff0c;根据自己需求选择1.7、选择套件1.8、项目管理&#xff0c;自行配置1.9、配置完成&#xff0c;系统自动更新配置 二、QT界面介绍…

Java Stream 的常用API

Java Stream 的常用API 遍历&#xff08;forEach&#xff09; package com.liudashuai;import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {List<Person> userList new ArrayList<>();userList.ad…