java数据结构与算法刷题-----LeetCode64. 最小路径和

news2024/9/30 15:28:07
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只不过大家都叫它dp),达到空间换时间的效果。它仅仅只是一种优化思路,因此它目前的境地和线性代数一样----虚假的难。

  1. 想想线性代数,在国外留学的学生大多数不觉得线性代数难理解。但是中国的学生学习线性代数时,完全摸不着头脑,一上来就是行列式和矩阵,根本不知道这玩意是干嘛的。
  2. 线性代数从根本上是在空间上研究向量,抽象上研究线性关系的学科。人家国外的教科书都是第一讲就帮助大家理解研究向量和线性关系。
  3. 反观国内的教材,直接把行列式搞到第一章。搞的国内的学生在学习线性代数的时候,只会觉得一知半解,觉得麻烦,完全不知道这玩意学来干什么。当苦尽甘来终于理解线性代数时干什么的时候,发现人家国外的教材第一节就把这玩意讲清楚了。你只会大骂我们国内这些教材,什么狗东西(以上是自己学完线性代数后的吐槽,我们同学无一例外都这么觉得)。

而我想告诉你,动态规划和线性代数一样,我学完了才知道,它不过就是研究空间换时间,提前将固定的重复操作规划到dp数组中,而不用暴力求解,从而让效率极大提升。

  1. 但是网上教动态规划的兄弟们,你直接给一个动态方程是怎么回事?和线性代数,一上来就教行列式和矩阵一样,纯属恶心人。我差不多做了30多道动态规划题目,才理解,动态方程只是一个步骤而已,而这已经浪费我很长时间了,我每道题都一知半解不理解,过程及其痛苦。最后只能重新做。
  2. 动态规划,一定是优先考虑重复操作与dp数组之间的关系,搞清楚后,再提出动态方程。而你们前面步骤省略了不讲,一上来给个方程,不是纯属扯淡吗?
  3. 我推荐研究动态规划题目,按5个步骤,从上到下依次来分析
  1. DP数组及下标含义
  2. 递推公式
  3. dp数组初始化
  4. 数组遍历顺序(双重循环及以上时,才考虑)
  5. dp数组打印,分析思路是否正确(相当于做完题,检查一下)

在这里插入图片描述

这道题是62题的衍生题,在62题的基础上,增加了一个条件,就是每个方块都有一个开销值,我们需要选择开销最小的哪条路,除此之外没有任何区别

可以先参考🏆LeetCode62. 不同路径https://blog.csdn.net/grd_java/article/details/135421514
先理解题目细节

在这里插入图片描述

  1. 起点在[0,0]位置,且只能向右或向下走,也就是说,我们到达每一个方格,只有两种情况,从上面过来的,或者从左面过来的。注意区分“走过去”和“从哪过来的区别”,这是解出这道题的关键。
  2. 我们依次走到每一个方块,不管其它的,只看当前方块,研究当前方块的最短路径
  3. 步骤如下:
  1. [0,0]位置:开销是1,到达这个位置只有一种方法,直接站上去,所以最短路径的开销就是1,故dp[0,0] = 1
  2. 第一行除起点[0,0]外的方块,想要到达它们同样只有一条路,那就是从起点一直向右走
  1. [0,1]位置,其本身开销为3,只有一种方法可以到达它,就是从左边过来,所以加上从起点到达左边这个[0,0]位置的最短开销1,一共为4. 因此 dp[0,1] = 4
  2. 同理[0,2]位置,本身开销1+起点到左边位置[0,1]开销4 = 5,故dp[0,2] = 5
  1. 第一列和第一行同理,除[0,0]外,只有从起点往下走这一条路
  1. [1,0]位置开销 = 本身开销1+[0,0]位置开销1 = 2
  2. **[2,0]位置开销 = 本身开销4+起点到[1,0]的开销 2=6 **
  1. 其余位置都有两种情况,从左边过来,或者从上面过来。因为这道题求最短开销,因此两个方向选小的那个
  1. [1,1]位置 = min{本身开销5+左边[1,0]开销2 = 7 , 本身开销5+ 上面[0,1]开销4 = 9} = 7. 从左边过来开销为7,上面过来开销为9,选小的7。
  2. [1,2]位置 = min{本身开销1+左边[1,1]开销7 = 8 , 本身开销1+ 上面[0,2]开销5 = 6} = 6
  3. [2,1]位置 = min{本身开销2+左边[2,0]开销6 = 8 , 本身开销2+ 上面[1,1]开销7 = 9} = 8
  4. [2,2]位置 = min{本身开销1+左边[2,1]开销8 = 9 , 本身开销1+ 上面[1,2]开销6 = 7} = 7
  1. 构建完dp数组,我们要返回的是起点[0,0]到终点[2,2]的最短路径,他就保存在dp[2,2]中。因为我们dp数组存储的就是起点到达每个位置的最短开销。
解题思路
  1. 暴力求解的思想,就是回溯算法,枚举每一种情况,拿到最大值,显然会做大量无效运算。
  2. 但是如果我们预先将其存储到dp数组,就可以直接通过dp[x], 获取dp数组中指定位置x的体力花费,而不用枚举。典型的动态规划题目
动态规划思考5步曲
  1. DP数组及下标含义

我们要求出的是到达某个方块,可以从哪里过来,过来的几种方法谁的开销最小,那么dp数组中存储的就是到达这里的最短路径开销。要求出谁的从起点到达后的最短开销呢?显然是某个方块,那么下标就是代表现在到了哪个方块,也就是代表到了某一方块后的最短开销。显然,需要2个下标表示,故这道题的dp数组需要二维数组

  1. 递推公式
  1. 由题意可知,只能选择向右走或者向下走,因此对于每个方块而言,只能是从上面过来,或者从左面过来。而第一行没有从上面来的路,因此只能从左面过来,也就是第一行都只有一条从左面来的路,直接计算从起点到它的开销即可。同理第一列,没有从左面来的路,只能从上面过来,也只有从上面过来这一条路,计算从起点到它的开销即可。
  1. 起点[0,0]的开销固定为其本身开销。F(0,0) = 其本身开销
  2. 第一行和第一列都固定为其唯一可通的路上的开销(行:从起点一直向右走。列是从起点一直向下走),F(0,n) = F(0,n-1)+其本身开销; F(n,0) = F(n-1,0)+其本身开销
  1. 之后每一个方块,都需要考虑从上面来的路,和从左面来的路。也就是到它上面的方块最短路径开销+其本身开销。和到它左面的方块的最短开销+其本身开销。选一个小的。
  2. 因此,可以得到,从第二行,第二列开始,递推公式变为,min(到左边方块的最短开销+其本身开销,到上面方块的最短开销+其本身开销)。F(n,n) = min(F(n-1,n)+其本身开销,F(n,n-1)+其本身开销)
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序

双重循环,我们知道这道题,数组下标表示方块的位置,也就是所在行和列的位置。那么其中一层循环代表第几行,另外一层循环代表第几列。那么先遍历行还是列呢?我们发现,无论遍历哪个,都不影响。我们可以一列一列考虑,也可以一行一行考虑,因此,先遍历哪个都一样。我们这里选择先遍历行。

  1. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

在这里插入图片描述

代码:时间复杂度O(mn).空间复杂度O(mn)

在这里插入图片描述

class Solution {
    public int minPathSum(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) return 0;
        int m = grid.length,n = grid[0].length;//获取行和列
        int dp[][] = new int[m][n];//dp数组表示每个方块,每个元素值代表从起点到这个方块的最短路径,下标代表其所在行和列
        dp[0][0] = grid[0][0];//到达第一个方块,只有一种方法,就是直接站上去,所以最短路径就是它本身开销
        //对于第一列来说,只有从上往下走这一条路,因此这条路上的每个方块的开销,就是从起点沿着这条路走到它的开销
        for(int i = 1;i<m;i++) dp[i][0] = dp[i-1][0]+grid[i][0];
        //第一行同理,只有从左往右这一条路
        for(int j = 1;j<n;j++) dp[0][j] = dp[0][j-1]+grid[0][j];
        //剩余的每个方块,都可以从上面过来,也可以从左面过来,我们选择值小的,也就是路径开销小的方向
        for(int i = 1;i<m;i++)
            for(int j = 1;j<n;j++)
                    dp[i][j] = Math.min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
        return dp[m-1][n-1];//最后返回终点的最短路径开销
    }
}

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

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

相关文章

基于Python新闻推荐系统 大数据毕业设计 爬虫+可视化+推荐算法 vue框架+Django框架(附源码)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

常见的DOM操作有哪些?常见的BOM对象有哪些?DOM操作与BOM对象的区别?

常见的DOM操作有哪些&#xff1f; 一、DOM 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口。 它提供了对文档的结构化的表述&#xff0c;并定义了一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式和内容。 任何 HTML或XML文档都…

FineBI:简介

1 介绍 FineBI 是帆软软件有限公司推出的一款商业智能&#xff08;Business Intelligence&#xff09;产品。 FineBI 是定位于自助大数据分析的 BI 工具&#xff0c;能够帮助企业的业务人员和数据分析师&#xff0c;开展以问题导向的探索式分析。 2 现阶段数据分析弊端 现阶…

【Java集合篇】为什么HashMap的Cap是2^n,如何保证?

为什么HashMap的Cap是2^n&#xff0c;如何保证&#xff1f; ✔️目录✔️ 为什么是2 ^ n ?✔️为什么 X %2^n X & (2^n - 1) ? ✔️如何保证✔️初始化时期保证✔️扩容时期保证 ✔️目录 ✔️ 为什么是2 ^ n ? HashMap是通过 (table.length - 1) & (key.hashCode …

swing快速入门(四十)JList、JComboBox实现列表框

注释很详细&#xff0c;直接上代码 新增内容 &#x1f9e7;1.列表的属性设置与选项监听器 &#x1f9e7;2.下拉框的属性设置与选项监听器 &#x1f9e7;3.Box中组件填充情况不符合预期的处理方法 &#x1f9e7;4.LIst向Vector的转化方法 源码&#xff1a; package swing31_40;i…

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中&#xff0c;我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

K8S集群部署解决工作节点couldn‘t get current server API group list问题

最近在自己电脑上装了VMWare Player&#xff0c;在上面装了两个Ubuntu虚拟机&#xff0c;为了方便学习云原生技术&#xff0c;决定在上面装一个2个节点&#xff08;一个控制面&#xff0c;一个工作节点&#xff09;的K8S集群。 参考这篇文章&#xff1a; Ubuntu 22.04 搭建K8…

WebStorm 创建一个Vue项目

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …

光明源:智慧公厕在实际应用中作用

什么是智慧公厕呢&#xff1f; 智慧公厕是一种应用先进科技和智能化技术的公共卫生设施&#xff0c;旨在提高公厕的管理效率、服务水平以及用户体验。这类公厕整合了各种现代技术&#xff0c;包括实时监控系统、智能预约服务、在线反馈机制、卫生自动化技术、导航服务、电子支…

Git 常用命令详解及如何在IDEA中操作

文章目录 前言发现宝藏一、初识Git1.Git概述2. Git的功能3. Git运行图示 二、Git下载安装三、Git 代码托管服务1.常用的 Git 代码托管服务2.使用码云代码托管服务 四、Git 常用命令1.Git 全局设置2.获取Git 仓库3.工作区、暂存区、版本库 概念4.Git 工作区中文件的两种状态5.本…

视频云存储/视频智能分析平台EasyCVR在麒麟系统中无法启动该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

2024年阿里云、腾讯云、华为云、LightNode、硅云服务器如何选?怎么买最划算?[最新价格表]

很多小伙伴都有一颗上云的心&#xff0c;包括我自己 有事没事的折腾一下自己的小破站&#xff0c;也挺有意思的&#xff01; 那么&#xff0c;云服务器哪家好&#xff1f;优惠力度哪家大&#xff1f;活动入口哪里进&#xff1f;云服务器如何配置&#xff1f;如何选型&#xf…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量预测多变量

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 ​1.3 缺失值分析 2 VMD经验模态分解 2.1 VMD分解实验 2.2 VMD-LSTM预测思路 3 构造训练数据 4 LSTM模型训练 5 LSTM模型预测 5.1 分量预测 5.2 可视化 时间序列预测专栏链接&#xff1a;https://blog.csdn.net/qq_…

前端Web系统架构设计

文章目录 1.目录结构定义2. 路由封装2.1 API路由定义2.2 组件路由定义 3. Axios请求开发4. 环境变量封装5. storage模块封装(sessionStorage, localStorage)6. 公共函数封装(日期,金额,权限..)7. 通用交互定义(删除二次确认,类别,面包屑...)8. 接口全貌概览 1.目录结构定义 2. …

Flume基础知识(十):Flume 聚合实战

1&#xff09;案例需求&#xff1a; hadoop100上的 Flume-1 监控文件/opt/module/group.log&#xff0c; hadoop101上的 Flume-2 监控某一个端口的数据流&#xff0c; Flume-1 与 Flume-2 将数据发送给 hadoop102 上的 Flume-3&#xff0c;Flume-3 将最终数据打印 到控制台。…

基于Java实现全功能电子商城

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 基于SpringBoot的旅游网站 基于SpringBoot的MusiQ音乐网站 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及…

【数据库】视图索引执行计划多表查询面试题

文章目录 一、视图1.1 概念1.2 视图与数据表的区别1.3 优点1.4 语法1.5 实例 二、索引2.1 什么是索引2.2.为什么要使用索引2.3 优缺点2.4 何时不使用索引2.5 索引何时失效2.6 索引分类2.6.1.普通索引2.6.2.唯一索引2.6.3.主键索引2.6.4.组合索引2.6.5.全文索引 三、执行计划3.1…

2024.1.5 关于 二叉平衡树(AVL 树)详解

目录 二叉搜索树 二叉搜索树的简介 二叉搜索树的查找 二叉搜索树的效率 AVL树 AVL 树的简介 AVL 树的实现 AVL树的旋转 右单旋 左单旋 左右双旋 右左双旋 完整 AVL树插入代码 验证 AVL 树 AVL 树的性能 二叉搜索树 要想了解关于二叉平衡树的相关知识&#xff0c;了…