【LeetCode: 剑指 Offer II 099. 最小路径之和 | 暴力递归 | DFS =>记忆化搜索=>动态规划】

news2024/11/25 16:43:35

在这里插入图片描述

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

在这里插入图片描述

目录

    • 题目链接
    • 题目描述
    • 求解思路&实现代码&运行结果
      • 暴力递归 | DFS
        • 求解思路
        • 实现代码1
        • 实现代码2
        • 运行结果
      • 记忆化搜索
        • 求解思路
        • 实现代码
        • 运行结果
      • 动态规划
        • 求解思路
        • 实现代码
        • 运行结果
    • 共勉

题目链接

剑指 Offer II 099. 最小路径之和
64. 最小路径和

题目描述

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:一个机器人每次只能向下或者向右移动一步。

在这里插入图片描述

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100

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

暴力递归 | DFS

求解思路

  1. 通过读取题目的意思我们可以知道,从左上角位置开始,每次可以向下走,或者向右走,求最后到达右下角位置路径的最小值。
  2. 我们可以对题目进行一个简单的分析,如果此时我们是处于最后一行的,那么下次我们只能继续向右走,同理,如果我们此时是处理最后一列的,那么下次我们只能向下走。
  3. 上面是俩种特殊情况,然后是任意一个位置,任意一个位置的值可能来自左侧,也可能来自上侧,我们需要取得它们的最小值,然后加上当前位置的值,不断重复这个过程,直到目标节点。

实现代码1

注意,代码的实现方式可以有很多,大家根据自己的习惯来就好

class Solution {
    public int minPathSum(int[][] grid) {
        int m=grid.length,n=grid[0].length;
        return process(0,0,m,n,grid);
    }

    public int process(int x,int y,int m,int n,int[][] grid){
        if(x>=m||y>=n) return Integer.MAX_VALUE;
        if(x==m-1&&y==n-1) return grid[x][y];
        return Math.min(process(x,y+1,m,n,grid),process(x+1,y,m,n,grid))+grid[x][y];
    }
}

实现代码2

class Solution {
    int min=Integer.MAX_VALUE;
    public int minPathSum(int[][] grid) {
        int m=grid.length,n=grid[0].length;
        process(0,0,m,n,grid,0);
        return min;
    }

    public void process(int x,int y,int m,int n,int[][] grid,int sum){
        if(x>=m||y>=n) return;
        if(x==m-1&&y==n-1){
            min=Math.min(min,sum+grid[x][y]); 
            return;
        }
        process(x,y+1,m,n,grid,sum+grid[x][y]);
        process(x+1,y,m,n,grid,sum+grid[x][y]);
    }
}

运行结果

大家不要看到时间超限就害怕,相反,看到这个我们更应该放心,这个是我们期待的结果。

在这里插入图片描述

记忆化搜索

求解思路

  1. 核心思路就是我们上面的求解过程,如果没有理解可以继续看上面的图解过程。
  2. 在原来的基础上加缓存表,将结果进行记录,避免重复计算。

实现代码

class Solution {
    public int minPathSum(int[][] grid) {
        int m=grid.length,n=grid[0].length;
        int[][] dp=new int[m][n];
        for(int i=0;i<m;i++) Arrays.fill(dp[i],-1);
        return process(0,0,m,n,grid,dp);
    }

    public int process(int x,int y,int m,int n,int[][] grid,int[][] dp){
        if(x>=m||y>=n) return Integer.MAX_VALUE;
        if(dp[x][y]!=-1) return dp[x][y];
        if(x==m-1&&y==n-1) return dp[x][y]=grid[x][y];
        return dp[x][y]=Math.min(process(x,y+1,m,n,grid,dp),process(x+1,y,m,n,grid,dp))+grid[x][y];
    }
}

运行结果

加个缓存表就是香,通过!

在这里插入图片描述

动态规划

求解思路

  1. 同理,核心求解思路我们上面已经讲过了,此处不同的是原来通过递归,此时我们通过dp数组和循环即可完成。

实现代码

继续改进!

class Solution {
    public int minPathSum(int[][] grid) {
        int m=grid.length,n=grid[0].length;
        int[][] dp=new int[m][n];
        dp[m-1][n-1]=grid[m-1][n-1];
        for(int i=m-2;i>=0;i--){
            dp[i][n-1]=dp[i+1][n-1]+grid[i][n-1];
        }
        for(int i=n-2;i>=0;i--){
            dp[m-1][i]=dp[m-1][i+1]+grid[m-1][i];
        }
        for(int x=m-2;x>=0;x--){
            for(int y=n-2;y>=0;y--){
                dp[x][y]=Math.min(dp[x][y+1],dp[x+1][y])+grid[x][y];
            }
        }
        return dp[0][0];
    }
}

运行结果

在这里插入图片描述

共勉

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

在这里插入图片描述

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

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

相关文章

4.java程序员必知必会类库之xml解析库

前言 百度百科解释 可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;标准通用标记语言的子集&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵…

(2023)基于多模态概率融合提示的少样本多模态情感分析

论文题目&#xff08;Title&#xff09;&#xff1a;Few-shot Multimodal Sentiment Analysis based on Multimodal Probabilistic Fusion Prompts 研究问题&#xff08;Question&#xff09;&#xff1a;用概率融合提示进行少样本的情感分析任务 研究动机&#xff08;Motiva…

IDEA插件-Lombok

在 Java 开发领域中&#xff0c;Lombok 插件已经成为一个非常流行的代码库。该插件让 Java 开发更加便捷、高效&#xff0c;因此提高了开发者的生产力。本文将对 Lombok 插件进行详细的介绍和分析。 1.Lombok是什么 Lombok 是一款 Java 开发工具&#xff0c;它可以通过注解来…

《离散数学导学》精炼——第8章(关系)

学无止境追求真&#xff0c;勤奋刻苦起点新。每日精进千里路&#xff0c;成功不是梦想闲。 文章目录引言正文第八章 关系定义定义域&#xff0c;值域关系的逆关系上的运算&#xff08;重点&#xff09;关系的合成同类关系和异类关系关系的性质&#xff08;重难点&#xff09;顺…

OpenAI-ChatGPT最新官方接口《嵌入向量式文本转换》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)

Embeddings 嵌入向量式文本转换前言Overview 概述What are embeddings? 什么是嵌入&#xff1f;How to get embeddings 如何获取嵌入python代码示例cURL代码示例Embedding models 嵌入模型Second-generation models 第二代模型First-generation models (not recommended) 第一…

Kubernetes 多集群管理工具Rancher 使用介绍

目录 一、Rancher 简介 2.1 Run Kubernetes Everywhere 2.2 满足 IT 需求规范 2.3 赋能 DevOps 开发团队 2.4 Rancher API Server 的功能 2.4.1授权和角色权限控制 2.4.2使用 Kubernetes 的功能 2.4.3 配置云端基础信息 2.4.4 查看集群信息 2.5 编辑下游集群 二、Ra…

漏洞挖掘-漏洞扫描

一、工具 1.针对某种漏洞 &#xff08;1&#xff09;sqlmap python sqlmap.py -u "url" --dbs 枚举所有数据库 python sqlmap.py -u "url" --current -db 当前数据库 python sqlmap.py -u "url" -D db_name --tables …

如何做一个园区的导航地图?园区楼宇地图导航如何实现?

如何做一个园区的导航地图&#xff1f;电子地图已成为智慧园区应用的重要组成部分和刚需&#xff0c;基于地图一方面为来园区人员进行导引&#xff0c;同时为园区内部的可视化设备设施、停车引导、物联数据的展示、园区物业资产管理等提供高效的管理工具&#xff0c;融入电子地…

数据可视化有哪些方式?【图表类型大全】

我们通常所说的数据可视化是指狭义的数据可视化&#xff0c;即将数据以图表的方式进行呈现&#xff0c;常见于PPT、报表、新闻等场景。图表是数据可视化最基础的应用&#xff0c;它代表图形化的数据&#xff0c;通常以所用的图形符号命名&#xff0c;例如使用圆形符号的饼图、使…

让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)

让你的作品更出色—— 词云Word Cloud的制作方法&#xff08;基于python) 本文目录&#xff1a; 一、词云的简介 二、 实现原理和流程 1、制作词云流程图 2、词云实现原理 三、 实现词云的方式 1、安装词云相关模块库 2、WordCloud库 3、stylecloud库 四、总结 一、词…

Point-to Analysis指针分析(1)

Point-to Analysis指针分析&#xff08;1&#xff09;_音程的博客-CSDN博客 前言 指针分析是一个非常复杂的工作&#xff0c;这些工作很多方向&#xff0c;比如是否是上下文敏感分析或上下文不敏感分析&#xff0c;显然&#xff0c;这难易度是不一样地。比如下图。对于同一段…

SAP之Suse For SAP 12 sp5安装教程(超详细)

本文将详细介绍如何在VM环境下安装Suse For SAP 12 sp5。 关于VM创建Suse Linux虚拟机的教程参考另一个博客-SAP之VM创建SUSE虚拟机。本文建立在VM已经创建好了Suse虚拟机的前提下。 一、首先进入到安装界面&#xff0c;选择“Installation”&#xff0c;按“Enter” 二、勾选…

第七章 无线与移动网络

无线网络 无线网络基本结构 无线主机&#xff1b;运行端系统设备无线链路&#xff1b;通过无线通信链路连接到一个基站或者另一条无线主机基站&#xff1b;无线网络基础设施的一个关键部分&#xff0c;负责向与之关联的无线主机发送数据和接收主机发送的数据网络基础设施&…

ROS使用(9)tf2

许多tf2教程可用于C和Python。本教程经过了精简&#xff0c;以完成C或Python。如果你想同时学习C和Python&#xff0c;你应该分别学习一次C和一次Python的教程。 工作区设置 Introduction to tf2.tf2的 介绍 本教程将给予你一个很好的想法tf2可以为你做什么。 它在一个使用tur…

自学大数据第十天~Hbase

随着数据量的增多,数据的类型也不像原来那样都是结构化数据,还有非结构化数据; Hbase时google 的bigtable的开源实现, BigtableHbase文件存储系统GFSHDFS海量数据处理MRMR协同管理服务chubbyzookeeper虽然有了HDFS和MR,但是对于数据的实时处理是比较困难的,没有办法应对数据的爆…

实现3D动画

一、transform Transform是形变的意思&#xff08;通常也叫变换&#xff09;&#xff0c;transformer就是变形金刚 常见的函数transform function有&#xff1a; 平移&#xff1a;translate(x, y) 缩放&#xff1a;scale(x, y) 旋转&#xff1a;rotate(deg) 倾斜&#xff1a;sk…

病毒丨3601lpk劫持病毒分析

作者&#xff1a;黑蛋 一、病毒简介 文件名称&#xff1a; 1f3e836b4677a6df2c2d34d3c6413df2c5e448b5bc1d5702f2a96a7f6ca0d7fb 文件类型(Magic)&#xff1a; PE32 executable (GUI) Intel 80386, for MS Windows 文件大小&#xff1a; 52.50KB SHA256&#xff1a; 1f3e836b4…

面试字节,三面HR天坑,想不到自己也会阴沟里翻船....

阎王易见&#xff0c;小鬼难缠。我一直相信这个世界上好人居多&#xff0c;但是也没想到自己也会在阴沟里翻船。我感觉自己被字节跳动的HR坑了。 在这里&#xff0c;我只想告诫大家&#xff0c;offer一定要拿到自己的手里才是真的&#xff0c;口头offer都是不牢靠的&#xff0…

可实现电控调光、宽视场角,FlexEnable曲面液晶解析

曲面显示屏、可变焦液晶透镜&#xff0c;这些似乎是属于未来AR/VR的趋势&#xff0c;而实际上已经有公司在提供此类技术&#xff0c;而这将有望对AR/VR产生重要影响。AR/VR光学专家Karl Guttag指出&#xff0c;其在CES 2023看到了一家专注于柔性显示、传感器的有机电子公司&…

传统机器学习(五)—分类、回归模型的常见评估指标

传统机器学习—分类、回归模型的常见评估指标 一、分类模型的常见评估指标 1.1 混淆矩阵 混淆矩阵&#xff0c;在无监督学习中被称为匹配矩阵(matching matrix)&#xff0c;之所以叫混淆矩阵&#xff0c;是因为我们能够很容易从图表中看到分类器有没有将样本的类别给混淆了。…