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

news2024/11/23 22:31:20

在这里插入图片描述

🍎作者简介:硕风和炜,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

求解思路

  1. 该题目的求解思路比较简单,我们直接从给定数组中的每一个位置开始遍历,通过DFS的思想找到上、下、左、右中最长的递增路径,记录当前位置的最大长度。
  2. 因为我们遍历的是整个数组,从每一个位置开始,所以说我们最后还需要比较每一个位置的长度,找到最长的即可。

实现代码

实现代码的方式有很多,你可以在设计递归的时候将参数放到函数中,也可以将参数设置为成员变量都是可以的,甚至再求一些值的时候,你可以将最后的答案放到参数中,当然也可以将每一步的答案都进行返回,递归设置相应的返回值。方式有很多,大家选择自己最喜欢,最熟悉的方式即可。

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;
    }
}

运行结果

我们可以看到时间超限了,不要紧,至少证明我们的思路是没有问题的,我们可以继续优化嘛。
在这里插入图片描述

记忆化缓存

求解思路

  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;
    }
}

运行结果

在这里插入图片描述

共勉

最后,我想送给大家一句一直激励我的座右铭,希望可以与大家共勉!
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

海康工业相机网口相机丢包问题解决方法

​1.1 系统环境设置 1.1.1 网卡设置 网卡推荐使 Intel 芯片的独立千兆网口,例如 intel I350、I210 等芯片组网卡 设置网卡巨型帧为选择 9KB 或 9014 字节 *不同网卡类型,网卡属性有差异,需灵活参考 设置网卡接收与传输缓存区到最大(intel 网卡一般为 2048,realtek 一般…

Program tuning - Druid和Linux配合优化数据库连接池配置

Program tuning - Druid和Linux配合优化数据库连接池配置配置步骤1. 添加依赖2. 添加配置3. 启动监控界面常见问题输入地址之后&#xff0c;浏览器直接打印html代码&#xff0c;而不是登录框刷新页面不能重新加载数据调优步骤1. 开始压测2. 监控线程池状态3. 查看服务器状态结论…

算法 贪心5 || 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435. 无重叠区间 和452. 用最少数量的箭引爆气球 思路是很相似的。本题按照左边排序或者按照右边排序都是可以的&#xff0c;最终目的都是为了让区间尽可能重叠。 1、按右边排序&#xff0c;排序完第一个元素的右边界一定是最小右边界。往下找第一个不与其重合的左边界&#x…

亚马逊云科技为全球的可持续发展进程做出贡献

可持续发展是一个涉及经济、环境和社会三个方面的复杂问题。经济发展必须在保护环境和社会公正的前提下进行&#xff0c;这样才能实现真正的可持续发展。为了实现这一目标&#xff0c;人们需要借助技术手段&#xff0c;更好地理解和解决环境和社会问题。 亚马逊云科技是全球领…

nssctf web入门(2)

目录 [SWPUCTF 2021 新生赛]easy_md5 [SWPUCTF 2021 新生赛]include [SWPUCTF 2021 新生赛]PseudoProtocols 这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解…

到了这个年纪,就应该阅读Spring源码了,源码阅读指南-编译加运行

文章目录到了那个年纪&#xff0c;就应该阅读Spring源码了&#x1f604;第一步&#xff0c;clone&#x1f606;第二步&#xff0c;使用idea打开项目&#x1f60a;gradle介绍&#xff08;插叙手法&#xff09;&#x1f603;第三步&#xff0c;修改gradle的远程仓库地址&#x1f…

Day932.5个步骤,高效推动组件化架构重构 -系统重构实战

5个步骤&#xff0c;高效推动组件化架构重构 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录都是关于5个步骤&#xff0c;高效推动组件化架构重构的内容。 项目的架构设计是一回事&#xff0c;代码落地又是另外一回事&#xff0c;很多架构设计最终都只是落在了 PPT 上。 一…

QT Graphics View坐标系转换

背景 在做绘图处理时&#xff0c;Scence作为场景&#xff0c;大小是无限的&#xff0c;而View作为一个观察镜头&#xff0c;观察范围是有限的。 那么有限的View观察无限的Scence区域&#xff0c;必然要选定一个观测锚点。 所以View具有一个centerOn(QPointF pos)函数&#xff…

Linux-初学者系列——篇幅1_文件管理命令(持续更新中)

Linux-初学者系列_篇幅1 文件管理命令-目录Linux-初学者系列_篇幅11.创建文件语法&#xff1a;示例&#xff1a;2.创建目录语法&#xff1a;示例&#xff1a;注意&#xff1a;常见错误&#xff1a;3.复制语法&#xff1a;示例&#xff1a;补充&#xff1a;4.移动语法&#xff1…

Vue|数据渲染

Vue 是如何将编译器中的代码转换为页面真实元素的&#xff1f;在Vue 中,自带了模板渲染,而模板的语法也非常简洁易懂。 精彩专栏持续更新↓↓↓ 微信小程序实战开发专栏 一. 数据渲染1.1 条件渲染v-ifv-show1.2 列表渲染v-for1.3 小结一. 数据渲染 1.1 条件渲染 vue条件渲染指…

3. 500 服务器异常 html

目录 1.效果图 2.code 1.效果图 2.code <!DOCTYPE html> <html><head><meta charset="utf-8"><title>500</title><style type="text/css">html,body {margin: 0;padding: 0;height: 100%;min-height: 450px;…

Git --- 常用命令、分支操作、团队协作机制

一、Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性 其性能优于 Subversion、…

多通道振弦传感器无线采集仪与参数配置工具连接

多通道振弦传感器无线采集仪与参数配置工具连接 VS101~VS432 设备配备了专门的参数配置工具 SETP 来完成设备工作参数的查看和修改工作。 连接前的准备工作 &#xff08; 1&#xff09;数据接口与计算机连接 使用标配的通讯线与计算机 RS232 接口连接。 若需基于手机网络发送数…

Java-异常机制

异常机制 正常情况下&#xff0c;程序按照我们希望的样子和步骤去执行&#xff0c;但是&#xff0c;代码就像人生&#xff0c;要是一帆风顺了&#xff0c;就要想想是不是哪里出事了。程序若是有报错还好&#xff0c;就怕没有报错。 实例 public class Test {public static vo…

如何用 YonBuilder 构建线索管理应用

加速企业数智营销&#xff1a;如何用 YonBuilder 构建线索管理应用 如何用 YonBuilder 低代码开发线索管理应用&#xff1f; 线索管理是指通过各种渠道收集、筛选、打分、分配、跟进和培育潜在客户的信息&#xff0c;以便将其转化为成交客户的过程。 通过数智化手段实现良好…

ArcGIS地质图矢量化技巧

01 概述 今天以ArcGIS为例&#xff0c;结合多年的工作经验&#xff0c;来介绍一下地质图矢量化的技巧。 02 底图的配准 不同比例尺的图件&#xff0c;有着不同的配准精度要求&#xff1a; 1&#xff1a;20万的地质图&#xff0c;配准误差不能高于20米&#xff1b; 1:50万…

DFIG控制9: 搭建定子αβ坐标系下的电机模型

DFIG控制9&#xff1a; 搭建定子αβ坐标系下的电机模型。本文基于教程的第9部分&#xff08;终于做完了&#xff09;。主要目的是自己搭建一个DFIG的电机模型&#xff0c;与Simulink库中的模型做个对比。 本文基于教程的第9部分&#xff1a; DFIM Tutorial 9 - Analytical Mod…

Focal Loss论文解读和调参教程

论文&#xff1a;Focal Loss for Dense Object Detection 论文papar地址&#xff1a;ICCV 2017 Open Access Repository 在各个主流深度学习框架里基本都有实现&#xff0c;本文会以mmcv里的focal loss实现为例&#xff08;基于pytorch&#xff09; 简介&#xff1a; 本文是…

1.mybatis-plus入门及使用

1.什么是MybatisPlus MyBatis-Plus 官网 为什么要学MybatisPlus&#xff1f; MybatisPlus可以节省大量时间&#xff0c;所有的CRUD代码都可以自动化完成MyBatis-Plus是一个MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效…

Java——数组中出现次数超过一半的数字

题目链接 牛客在线oj题——数组中出现次数超过一半的数字 题目描述 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次&#xff0c;…