【LeetCode: 剑指 Offer II 112. 最长递增路径 | 递归 | DFS | 深度优先遍历 | 记忆化缓存表】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🍎座右铭:人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯🎯

目录
- 题目链接
- 题目描述
- 求解思路&实现代码&运行结果
- DFS
- 求解思路
- 实现代码
- 运行结果
- 记忆化缓存
- 求解思路
- 实现代码
- 运行结果
- 共勉
题目链接
剑指 Offer II 112. 最长递增路径
329. 矩阵中的最长递增路径
题目描述
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。


提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 231 - 1
求解思路&实现代码&运行结果
DFS
求解思路
- 该题目的求解思路比较简单,我们直接从给定数组中的每一个位置开始遍历,通过DFS的思想找到上、下、左、右中最长的递增路径,记录当前位置的最大长度。
- 因为我们遍历的是整个数组,从每一个位置开始,所以说我们最后还需要比较每一个位置的长度,找到最长的即可。
实现代码
实现代码的方式有很多,你可以在设计递归的时候将参数放到函数中,也可以将参数设置为成员变量都是可以的,甚至再求一些值的时候,你可以将最后的答案放到参数中,当然也可以将每一步的答案都进行返回,递归设置相应的返回值。方式有很多,大家选择自己最喜欢,最熟悉的方式即可。
class Solution {public int longestIncreasingPath(int[][] matrix) {int m=matrix.length,n=matrix[0].length;int max=Integer.MIN_VALUE;for(int i=0;i<m;i++){for(int j=0;j<n;j++){max=Math.max(max,process(i,j,m,n,matrix));}}return max;}public int process(int x,int y,int m,int n,int[][] matrix){int up=x>0&&matrix[x][y]<matrix[x-1][y]?process(x-1,y,m,n,matrix):0;int right=y<n-1&&matrix[x][y]<matrix[x][y+1]?process(x,y+1,m,n,matrix):0;int down=x<m-1&&matrix[x][y]<matrix[x+1][y]?process(x+1,y,m,n,matrix):0;int left=y>0&&matrix[x][y]<matrix[x][y-1]?process(x,y-1,m,n,matrix):0;return Math.max(Math.max(up,right),Math.max(down,left))+1;}
}
运行结果
我们可以看到时间超限了,不要紧,至少证明我们的思路是没有问题的,我们可以继续优化嘛。

记忆化缓存
求解思路
- 我们直接添加一个缓存表,避免一个结果会重复产生计算,如果我们之前计算过,此时直接返回就可以。
实现代码
class Solution {public int longestIncreasingPath(int[][] matrix) {int m=matrix.length,n=matrix[0].length;int[][] dp=new int[m][n];for(int i=0;i<m;i++){Arrays.fill(dp[i],-1);}int max=Integer.MIN_VALUE;for(int i=0;i<m;i++){for(int j=0;j<n;j++){max=Math.max(max,process(i,j,m,n,matrix,dp));}}return max;}public int process(int x,int y,int m,int n,int[][] matrix,int[][] dp){if(dp[x][y]!=-1) return dp[x][y];int up=x>0&&matrix[x][y]<matrix[x-1][y]?process(x-1,y,m,n,matrix,dp):0;int right=y<n-1&&matrix[x][y]<matrix[x][y+1]?process(x,y+1,m,n,matrix,dp):0;int down=x<m-1&&matrix[x][y]<matrix[x+1][y]?process(x+1,y,m,n,matrix,dp):0;int left=y>0&&matrix[x][y]<matrix[x][y-1]?process(x,y-1,m,n,matrix,dp):0;return dp[x][y]=Math.max(Math.max(up,right),Math.max(down,left))+1;}
}
运行结果

共勉
最后,我想送给大家一句一直激励我的座右铭,希望可以与大家共勉!


相关文章:
【LeetCode: 剑指 Offer II 112. 最长递增路径 | 递归 | DFS | 深度优先遍历 | 记忆化缓存表】
🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…...
hive 入门 一般用于正式环境 修改元数据(二)
安装配置可参考 https://blog.csdn.net/weixin_43205308/article/details/130020674 1、如果启动过derby,最小初始化过 在安装路径下删除 derby.log metastore_db rm -rf derby.log metastore_db此处省略安装mysql数据库 2、配置MySQL 登录mysql mysql -uroot …...
在RedHat系统上使用firewall-cmd命令可以将端口打开
在RedHat系统上使用firewall-cmd命令可以将端口打开,具体操作如下: 首先,检查当前系统使用的防火墙服务,比如firewalld或iptables,使用以下命令: systemctl status firewalld # 检查firewalld服务 system…...
分享(五):免费可用的多种类 API 大全集合整理
前言 搜罗了各大平台整理了一波免费可以用的 API ,有需要的收藏起来啦。 实名认证 运营商二要素 API :运营商校验此姓名、手机号码是否一致。 运营商三要素 API:运营商验证姓名、身份证号码、手机号码是否一致,返回验证结果称…...
8.1 假设验证的基本概念
学习目标: 要学习假设检验的基本概念,我会按照以下步骤进行: 了解假设检验的基本概念:假设检验是一种统计推断方法,用于判断某个假设是否成立。一般来说,假设检验包括原假设和备择假设两个假设,…...
C语言基础
为了学习数据结构,整理一篇基础的C语言入门知识(仅供自身学习用) 条件运算符 语法:exp1 ? exp2 : exp3; exp1是条件表达式,如果结果为真,返回exp2 如果结果为假,返回exp3 if (a > b)max …...
Docker教程:如何将Helix QAC创建为一个容器并运行?
在这个Docker教程中,你将了解到如何将Helix QAC创建为一个容器化的镜像并运行。 Docker的基本定义是一个开源且流行的操作系统级虚拟化(通常称为“容器化”)技术,它是轻量级且可移植的,主要在Linux和Windows上运行。D…...
1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理
全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光,看起来MIT的课程的确是很有饱满度。 这里,再整理一份课程中的作业要求。 …...
记一次内存泄漏问题的排查
阶段一: 前段时间,突然发现服务在毫无征兆的情况下发生了重启。去看了一下容器退出的日志,发现内存利用率超过了100%,导致容器重启,进一步看了skyWalking,发现heap内存超了,当时只是简单的以为是…...
QML控件--Drawer
文章目录一、控件基本信息二、控件使用三、属性成员一、控件基本信息 Import Statement:import QtQuick.Controls 2.14 Since:Qt 5.7 Inherits:Popup 二、控件使用 Drawer:提供一个可以使用滑动手势打开和关闭的侧面板ÿ…...
PHY- PHY芯片概述
1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…...
【C++】如何获取当前正在运行的函数的名称?
func、FUNCTION、__PRETTY_FUNCTION__的区别 常用获取函数名成的方法都有__func__、FUNCTION、PRETTY_FUNCTION。那么它们的区别是什么呢? 1) func、FUNCTION: 主要是获取函数的名称。 2) PRETTY_FUNCTION: 不仅能获取函数的名称&am…...
42.原型对象 prototype
目录 1 面向对象与面向过程 2 原型对象 prototype 3 在内置对象中添加方法 4 constructor 属性 5 实例对象原型 __proto__ 6 原型继承 7 原型链与instanceof 7.1 原型链 7.2 instanceof 8 案例-模态框 1 面向对象与面向过程 编程思想有 面向过程 与 面向…...
python 读写txt方法
1. Python支持在程序中读写 txt文件。这里有两种方式: 方式一:使用 python内置函数,该函数将一个字符串的长度转换为与这个字符串长度相关的值。 例如:" readme"("r)。 prin…...
香橙派pi5下,debian,docker19.03.9版本runc容器逃逸
在香橙派pi5下,debian,docker19.03.9版本下,安装系统后,启动docker,显示一切正常。 当加入k8s集群以后,可以正常连接到集群,node状态显示为ready。看起来一切正常。不过过一会之后,香橙派节点内存飙升,然后挂掉。重连失败,需要重启后才能重连。且swapoff -a命令执行…...
Thinkphp6.0中间件.上
本节课我们来学习一下中间件的用法,定义一下中间件。 一.定义中间件 1. 中间件的主要用于拦截和过滤 HTTP 请求,并进行相应处理; 2. 这些请求的功能可以是 URL 重定向、权限验证等等; 3. 为了进一步了解中间件的用法&…...
十进制到八进制的转换
目录 十进制到八进制的转换 程序设计 程序分析 十进制到八进制的转换 【问题描述】对于输入的任意一个非负十进制整数n(0=<n<100000),打印输出与其等值的八进制数 【输入形式】非负十进制整数 【输出形式】相应十进制整数转换后的八进制正整数,若输入不符合要求,…...
【从零开始学Skynet】基础篇(四):网络模块常用API
游戏服务端要处理客户端请求,作为服务端引擎,网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API,常用的API如下表所示:Lua API说明socket.listen(address ,port)监听一个端口,返回…...
怎么免费制作logo?logo免费设计在线生成,从此设计不求人
你有没有因为Logo制作而烦恼过?对于很多人来说,logo制作是一项比较大的工程,需要专门的设计师才能完成。但是请人设计费用高还很费时间,还需多次沟通修改。其实,我们可以自己免费制作logo,下面,…...
【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现
前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息,那么是否有办法加入一些先验信息来提升目标检测的精准度? 一种可行的思路是在目标检测的输出加入目标之间的关联信息,从而对目标进行干涉。 2017年8月,新加波管理大学…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
