【LeetCode: 931. 下降路径最小和 | 暴力递归=>记忆化搜索=>动态规划 】

news2024/11/24 7:36:57

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 931. 下降路径最小和

⛲ 题目描述

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1:
在这里插入图片描述

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:
在这里插入图片描述

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

n == matrix.length == matrix[i].length
1 <= n <= 100
-100 <= matrix[i][j] <= 100

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 这个题目的求解思路比较简单,直接根据题目的意思就可以知道每一个位置的结果来自何方,得到当前位置的最小和,不断的转移,直到得到最终的结果即可。
  2. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {

    int[][] matrix;
    int n;

    public int minFallingPathSum(int[][] matrix) {
        this.matrix=matrix;
        this.n=matrix.length;
        int min=Integer.MAX_VALUE;
        for (int j=0;j<n;j++){
            min=Math.min(min,process(n-1,j));
        }
        return min;
    }

    public int process(int i, int j) {
        if(j<0||j>=n) return Integer.MAX_VALUE; 
        if(i==0) return matrix[0][j];
        return Math.min(Math.min(process(i-1,j-1),process(i-1,j)),process(i-1,j+1))+matrix[i][j];
    }
}

🥦 运行结果

时间复杂度&空间复杂度

时间超限,不要紧,是我们意料之中的结果!
在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {

    int[][] matrix;
    int n;
    int[][] dp;

    public int minFallingPathSum(int[][] matrix) {
        this.matrix=matrix;
        this.n=matrix.length;
        int min=Integer.MAX_VALUE;
        dp=new int[n][n];
        for(int i=0;i<n;i++) Arrays.fill(dp[i],Integer.MAX_VALUE);
        for (int j=0;j<n;j++){
            min=Math.min(min,process(n-1,j));
        }
        return min;
    }

    public int process(int i, int j) {
        if(j<0||j>=n) return Integer.MAX_VALUE; 
        if(i==0) return dp[i][j]=matrix[0][j];
        if(dp[i][j]!=Integer.MAX_VALUE) return dp[i][j];
        return dp[i][j]=Math.min(Math.min(process(i-1,j-1),process(i-1,j)),process(i-1,j+1))+matrix[i][j];
    }
}

🥦 运行结果

通过缓存,将重复计算的结果缓存下来,通过。

时间复杂度&空间复杂度
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

class Solution {
    public int minFallingPathSum(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],Integer.MAX_VALUE);
        for(int j=0;j<n;j++) dp[0][j]=matrix[0][j];
        for(int i=1;i<m;i++){
            for(int j=0;j<n;j++){
                if(j-1<0){
                    dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j+1])+matrix[i][j];
                }else if(j+1>=m){
                    dp[i][j]=Math.min(dp[i-1][j-1],dp[i-1][j])+matrix[i][j];
                }else{
                    dp[i][j]=Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i-1][j+1]))+matrix[i][j];
                }
            }
        }
        int min=Integer.MAX_VALUE;
        for(int j=0;j<n;j++){
            min=Math.min(min,dp[m-1][j]);
        }
        return min;
    }
}

🥦 运行结果

动态规划搞定,大家可以积极的尝试。

时间复杂度&空间复杂度

在这里插入图片描述

扩展:还可以继续进行优化算法的空间复杂度


💬 共勉

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

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

中国8K摄像机厂家加入国际广电设备制造商协会IABM

近日&#xff0c;BOSMA博冠正式成为国际广电设备制造商协会IABM会员&#xff0c;标志着中国8K摄像机厂家BOSMA博冠在广播电视超高清前端采集领域受到全球广电权威机构认可&#xff0c;进一步推动国产品牌在全球市场竞争中提升品牌知名度、加强行业影响力。 IABM创立于1976年&am…

【Unity面试篇】Unity 面试题总结甄选 |C#基础篇 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点&#xff1a;&#x1f431;‍&#x1f3cd;2023年Unity面试题大全&#xff0c;共十万字面试题总结【收藏一篇足够面试&#xff0c;持续更新】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理了新…

android更换开机动画

android11 路径&#xff1a;device / {vendor-name} / {platform-name} / {device-name} / system / bootanimation.zip 例&#xff1a;android \ device \ softwinner \ ceres \ ceres-b6 \ system \ bootanimation.zip android13 路径&#xff1a;device / softwinner / {PRO…

2023年最全最新的学习课程合集

WEB前端入门&#xff1a;从零开始做网站。 完成所有课堂练习就可以做出自己的作品&#xff0c;并掌握数据库和了解开源项目。 这些课程涵盖了HTML、CSS和JavaScript等前端技术&#xff0c;以及与之相关的设计原则和最佳实践。 前端课程的目标是培养学生在网页开发方面的技能…

uniCloud

uniCloud 一、介绍1.新建项目2.初识云函数 二、数据库1.在云控制台操作数据库2.通过云函数对数据库进行操作&#xff08;1&#xff09;查询&#xff08;2&#xff09;修改&#xff08;3&#xff09;删除 3.客户端操作4.JQL语法 三、云函数四、云对象五、云存储六、uni-id七、扩…

2023年7月深圳软考中级系统集成项目管理工程师报名

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

EasyCVR接口调用正常,但快照不显示是什么原因?

有用户反馈&#xff0c;现场部署了EasyCVR v3.1版本&#xff0c;将设备通过国标GB28181协议接入到平台&#xff0c;但是页面没有显示出快照&#xff0c;请求我们协助排查。 针对用户的反馈&#xff0c;我们立即排查。排查后发现&#xff0c;视频播放是正常的&#xff0c;调用接…

玩转字符串函数与字符函数——【C语言】

在C语言的学习中&#xff0c;我们经常会遇到字符串&#xff0c;对它的处理也是数不胜数&#xff0c;但是我们没有很好的处理办法&#xff0c;字符串只能放在字符数组或常量字符串中通过自定义函数去使用处理。而现在我将带领大家学习C语言函数库中专门处理字符串的函数。 这些…

超高性能MCU发布,为开发人员提供了高效的工具链

近日嵌入式开发软件和服务的全球领导者IAR与业界领先的半导体器件供应商兆易创新(GigaDevice)宣布&#xff0c;联合推出最新版本IAR Embedded Workbench for Arm 9.40已经全面支持兆易创新的GD32H737/757/759系列超高性能MCU微控制器&#xff0c;这为**ERP系统**开发人员提供了…

Java 注解使用

一、注解简介 注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。这些工具可以在源码层次上进行操作&#xff0c;或者可以处理编译器在其中放置了注解的类文件。 注解不会改变程序的编译方式。Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令。 为…

7种优秀的电商API命名方式

本文通过展示7种优秀API命名实践&#xff0c;来协助您创建高效的API端点&#xff0c;为用户提供更好的使用体验。 如今&#xff0c;API已成为了现代化编程的基本组成部分。它们不但能够改善不同开发团队的协作、并鼓励创新&#xff0c;而且能够提高应用程序的安全性。而作为两…

用PCB加热PCB——PCB加热台

之前为了焊接一些小贴片模块&#xff0c;想过买一个加热台&#xff0c;后来一搜加热台&#xff0c;发现有很多卖PTC加热板的&#xff0c;就又想自己做一个加热台。正好这个月嘉立创又送了打样券&#xff0c;搞起来~ PCB加热台设计主要考虑以下几个方面&#xff1a; 面积功率铜…

【方法】电脑如何打开Heic文件?

存放在电脑里的Heic文件打不开&#xff1f;相信有小伙伴也遇到过这样的问题。 因为Heic是苹果升级到ios11之后&#xff0c;在拍摄照片时的默认图像存储格式&#xff0c;只能兼容苹果系列产品&#xff0c;不能在Windows电脑里打开。&#xff08;Windows10 RS4开始支持该格式&am…

概率论的学习和整理18:为什么 P(至少成功1次概率) = Σ p(几何分布概率之和)----(未完成)

我们计算几何概率时&#xff0c;会很容易发现这么一个特点 我们很容易计算 试验n次&#xff0c;连续成功概率试验n次&#xff0c;连续失败概率试验n次&#xff0c;至少成功1次概率试验n次&#xff0c;最后一次成功概率试验n次&#xff0c;成功k次概率试验n次&#xff0c;累计成…

python3的全局解释器锁是什么意思?有什么要注意的?

Python中的全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;GIL&#xff09;是一种机制&#xff0c;用于确保在任何给定时间只有一个线程执行Python字节码。GIL是由Python解释器实现的&#xff0c;对于CPython解释器来说是存在的&#xff0c;其他一些Python解释器…

[chatgpt+Azure]unity AI二次元小女友之使用微软Azure服务实现RestfulApi->语音识别+语音合成

1.简述 如题所述&#xff0c;这个小项目是在unity引擎端&#xff0c;使用了chatgpt微软azure的一个AI二次元女友对话的项目&#xff0c;实现原理也比较简单&#xff0c;即在unity端实现AI二次元女友的交互界面&#xff0c;接入chatgpt-3.5-turbo的api接口&#xff0c;借助chatg…

探讨餐饮行业油烟污染与治理措施

安科瑞 华楠 摘 要&#xff1a; 近年来我国餐饮行业油烟污染已成为城市大气污染的主要来源之一。如今环境问题日益突出严重制约到人们的身体健康&#xff0c;需要引起重视采取一系列有效的措施来治理餐饮行业的油烟污染。 关键词&#xff1a;餐饮业&#xff1b;污染&#xf…

STM32驱动ADS1256串口输出-AD转换

STM32驱动ADS1256串口输出-AD转换 ADS1256ADS1256简介芯片特点引脚说明模块相关寄存器与命令相关程序初始化 实验效果接线实验现象 ADS1256 ADS1256简介 ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编…

Spring依赖注入Bean类型的8种情况详解

1、普通对象 这没什么好说的&#xff0c;大家都这么用的&#xff0c;比如需要用到 UserService&#xff0c;直接 Autowired 就可以了。 Autowired private UserService userService;2、Collection 及其子接口 除了支持注入一个单一的对象之外&#xff0c;Autowired 还支持注…

100天精通Golang(基础入门篇)——第16天:深入解析Go语言包的使用和包管理

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…