BM61 矩阵最长递增路径

题目 矩阵最长递增路径

给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件: 1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。 2. 你不能走重复的单元格。即每个格子最多只能走一次。 数据范围:, 进阶:空间复杂度 ,时间复杂度 例如:当输入为[[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
在这里插入图片描述

BM61 矩阵最长递增路径

该题是牛客网基础算法题递61题。

暴力探索:

根据题意是每个坐标点在上下左右方向可增量延伸的最长路径。如果能够记录每个坐标点,在每个坐标探索一遍可能生成的路径,最后取最长的那条, 就是每个坐标的最长路径。最后提示时间超时了, 只能解到第二组就超时了。

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 递增路径的最大长度* @param matrix int整型二维数组 描述矩阵的每个数* @return int整型*/
export function solve(matrix: number[][]): number {// write code hereconst result = {}const backupStack = []matrix.forEach((arr, y) => {arr.forEach((val, x) => {backupStack.push({ x, y })})})const computed = (value: number, key: string) => {if (Array.isArray(result[key])) {const maxVal = Math.max(...result[key])if (value > maxVal) {result[key].push(value)}} else {result[key] = [value]}}const callback = (y: number, x: number, key: string) => {if (matrix[y] && matrix[y][x]) {const value = matrix[y][x]computed(value, key)// leftif (matrix[y] && matrix[y][x] < matrix[y][x - 1]) {callback(y, x - 1, key)}// rightif ( matrix[y] && matrix[y][x] < matrix[y][x + 1]) {callback(y, x + 1, key)}// topif (matrix[y - 1] && matrix[y][x] < matrix[y - 1][x]) {callback(y - 1, x, key)}// bottomif (matrix[y + 1] && matrix[y][x] < matrix[y + 1][x]) {callback(y + 1, x, key)}}}while (backupStack.length > 0) {const item = backupStack.shift()if (item) {const { x, y } = itemconst key = `${y}-${x}`callback(y, x, key)}}const getLength = () => {const list: number[][] = Object.values(result)return Math.max(...(list.map(arr => arr.length)))}return getLength()
}

在这里插入图片描述

理论上足够覅人时间和空间是可以解出来的,实践上在该题的要求下,时间是不满足的。

不再二次探索相同的地方.

通过观察发现其中已经探索过的节点其实不需要在继续探索了,只需要拿到已经探索过的点的最长路径就可以了,如果该节点还没有被遍历探索那么继续探索,直到走完所有节点
细节注意:因为每个方向都要判断有没路径,所以需要判断边界,只能在没有超出数据边界的情况下进行。

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 递增路径的最大长度* @param matrix int整型二维数组 描述矩阵的每个数* @return int整型*/
export function solve(matrix: number[][]): number {// write code hereconst resultMap = matrix.slice(0, matrix.length).map(arr => arr.map(_ => 0))const dfs = (y, x) => {if (resultMap[y][x] > 0) {return resultMap[y][x]}if (resultMap[y][x] === 0) {resultMap[y][x] = 1}const direction = [[y + 1, x],[y - 1, x],[y, x - 1],[y, x + 1]]direction.forEach(([nextY, nextX], k) => {const yL = matrix.lengthconst xL = matrix[y].lengthif ((nextY >= 0 && nextY < yL) &&(nextX >= 0 && nextX < xL) &&(matrix[y][x] < matrix[nextY][nextX])) {resultMap[y][x] = Math.max(resultMap[y][x], dfs(nextY, nextX) + 1)}})return resultMap[y][x]}const getMaxLen = () => {let num = 0matrix.forEach((arr, y) => {arr.forEach((_, x) => {num = Math.max(num, dfs(y, x))})})return num}return getMaxLen()
}

多学多练就能提高编程水平。

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

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

相关文章

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…

初识Dubbo学习,一文掌握Dubbo基础知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Ubuntu-报错

Hadoop-Eclipse-java&#xff1a;耽误进度的几个报错 错误1&#xff1a;桥接模式与NAT模式相互切换后导致两种模式都不能访问互联网&#xff08;1&#xff09;具体错误&#xff1a;&#xff08;2&#xff09;错误原因&#xff1a;&#xff08;3&#xff09;解决方案&#xff1a…

Redis设计与实现之订阅与发布

目录 一、 订阅与发布 1、 频道的订阅与信息发送 2、订阅频道 3、发送信息到频道 4、 退订频道 5、模式的订阅与信息发送 ​编辑 6、 订阅模式 7、 发送信息到模式 8、 退订模式 三、订阅消息断连 1、如果订阅者断开连接了&#xff0c;再次连接会不会丢失之前发布的消…

股票价格预测 | Python实现基于Stacked-LSTM的股票预测模型,可预测未来(keras)

文章目录 效果一览文章概述模型描述源码设计效果一览 文章概述 以股票价格预测为例,基于Stacked-LSTM的股票预测模型(keras),可预测未来。 模型描述 LSTM 用于处理序列数据,如时间序列、文本和音频。相对于传统的RNN,LSTM更擅长捕获长期依赖关系,

tomcat错误

Error running Tomcat8: Address localhost:1099 is already in use window环境&#xff0c;打开cmd netstat -ano | findstr :1099发现对应PID为24732 结束PID taskkill /PID 24732 /F

MATLAB图像处理技巧

MATLAB图片处理------动态绘图 1. 动态绘图2. XXXXX 1. 动态绘图 主要用到四个函数&#xff0c;分别为getframe、frame2im、rgb2ind以及imwrite&#xff1a; 1.getframe&#xff1a;获取当前绘图窗口的图片作为影片帧&#xff1b; 2.frame2im&#xff1a;从单个影片帧 F 返回索…

Redis Set类型

集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是无序的 2&#xff09;元素不允许重复 一个集合中最多可以存储2的32次方个元素。Redis 除了支持集合内的增删查改操作&#xff0c;同时还支持多个集合取交…

Axure元件的介绍使用以及登录界面

一、Axure元件介绍 简介&#xff1a; Axure元件是一种功能强大的设计工具&#xff0c;专门用于用户体验设计和交互设计。它可以帮助设计师创建可交互的原型&#xff0c;并实现各种界面元素的设计和布局。 Axure元件的基本特点包括&#xff1a; 多样性&#xff1a;Axure元件包括…

自动驾驶学习笔记(二十)——Planning算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 参考线平滑 双层状态机 EM Planner …

找到一些看似冷门但流量惊人的一些网站!- 独立产品灵感周刊 DecoHack #057

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 &#x1f4bb; 产品推荐 1. Drawing Pics…

【Filament】绘制三角形

1 前言 Filament环境搭建中介绍了 Filament 的 Windows 和 Android 环境搭&#xff0c;本文将使用 Filament 绘制纯色和彩色三角形。 1.1 Filament 类图 1.2 图元 Filament 中图形的绘制都是基于三角形实现&#xff0c;三角形是构成复杂图形的最小基本单元。Filament 中输入模…

springMVC-模型数据的处理

一、数据放入到request域当中 1、把获取的数据放入request域中&#xff0c; 方便在跳转页面去显示 <a>添加主人信息</a> <form action"vote/vote04" method"post" >主人id&#xff1a;<input type"text" name"id&q…

JS中的模板字符串(ES6中的模板字面量语法),什么是模板字符串、怎么使用,附代码演示

模板字符串 1、JavaScript 在 ES6 新增了模板字符串语法。模板字符串可以作为普通字符串使用&#xff0c;其作用是可以在字符串中换行&#xff08;也就是支持多行字符串&#xff09;以及将变量和表达式插入字符串。 2、整个语法&#xff1a;使用反引号 &#xff0c;而不是单引…

MindOpt工具是如何做到配套使用的?请看此篇

Mindopt 介绍 MindOpt是阿里巴巴达摩院决策职能实验室研发的专注于优化领域&#xff0c;提供智能优化解决方案的品牌。主要的目标是帮助客户通过先进的优化算法和技术&#xff0c;实现业务流程的最佳化&#xff0c;提升效率&#xff0c;降低成本&#xff0c;并最大化业务价值。…

【强化学习-读书笔记】表格型问题的 Model-Free 方法

参考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. Barto无模型方法 在前面的文章中&#xff0c;我们介绍的是有模型方法&#xff08;Model-Based&#xff09;。在强化学习中&#xff0c;"Model"可以理解为算法…

助力智能人群检测计数,基于YOLOv3开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

YOLOv3-YOLOv8的一些总结

0 写在前面 这个文档主要总结YOLO系列的创新点&#xff0c;以YOLOv3为baseline。参考(抄)了不少博客&#xff0c;就自己看看吧。有些模型的trick不感兴趣就没写进来&#xff0c;核心的都写了。 YOLO系列的网络都由四个部分组成&#xff1a;Input、Backbone、Neck、Prediction…

Spring之容器:IOC(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Nat. Methods | RoseTTAFoldNA准确预测蛋白质-核酸复合体

今天为大家介绍的是来自Frank DiMaio团队的一篇论文。蛋白质-核糖核酸&#xff08;RNA&#xff09;和蛋白质-脱氧核糖核酸&#xff08;DNA&#xff09;复合体在生物学中扮演着至关重要的角色。尽管近年来在蛋白质结构预测方面取得了显著进展&#xff0c;但预测没有同源已知复合…