java数据结构与算法刷题-----LeetCode198. 打家劫舍

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数组打印,分析思路是否正确(相当于做完题,检查一下)

在这里插入图片描述

在这里插入图片描述

先理解题目细节

想象这样一个场景,我们是小偷,从第一栋挨个考虑偷还是不偷,如果偷,那就是身上已经偷了多少+这一栋能偷多少。如果不偷,那就是身上已经偷了多少。

在这里插入图片描述

  1. 题目给我们的数组代表每个房子有多少钱,而且相邻的房子不能都偷,只能偷不相邻的。
  2. 例如2,1,1,2 这个序列,显然不触发警报的前提下(不偷相邻的)----偷第一个和第4个为能偷到的最多的钱
  3. 怎么偷才能偷到最多呢?当然是保证最大获利情况下,能偷的都偷了,而且不能触发警报。
  4. 我们每个房子都单独考虑,偷还是不偷,而且只需考虑它前面的房子,因为我们要能偷的都偷
  1. 若要偷当前房子:那么,前面相邻的不能考虑,只能考虑再前面一个,也就是当前房子的金额,加上除了前面一个相邻的房子外,已经偷了多少。
  2. 若不偷当前房子:那么,前面偷了多少,到这个房子就还有多少,金额不变
解题思路
  1. 暴力求解的思想,就是回溯算法,枚举每一种情况,拿到最大值,显然会做大量无效运算。
  2. 但是如果我们预先将其存储到dp数组,就可以直接通过dp[x], 获取dp数组中指定位置x的体力花费,而不用枚举。典型的动态规划题目
动态规划思考5步曲
  1. DP数组及下标含义

我们要求出的是到了某个房子后最大情况下偷了多少钱,那么dp数组中存储的就是最大情况下偷了多少钱。要求出谁的最大情况下偷了多少。显然是到达某个房子后,那么下标就是代表现在到了哪个房子,也就是代表到了某一栋房子后的最大已偷取的金额。显然,只需要一个下标即可表示,故这道题的dp数组只需要一维数组

  1. 递推公式
  1. 由题意可知,每个房子都可以选择偷与不偷,选择最大值。而第一个房子肯定要偷它,才能获得最大值。而第二个房子,因为它前面没有不相邻的房子,所以它要么不偷,也就是只偷第一个房子。要么选择偷第二个房子,而第一个房子不偷,然后选择最大情况。

故:第一个房子固定为F(0) = 第一个房子金额。第二个固定为F(1) = max(第一个房子金额,第二个房子金额)

  1. 之后每一栋,都需要判断它偷还是不偷,以及前面不相邻的房子。如果偷,就要考虑前面不相邻的+自己这栋能偷多少钱。不偷,那么前一栋相邻的它肯定考虑一下。而前面的房子怎么考虑的是前面房子的事,它们也考虑过了偷还是不偷。我们只考虑当前这栋是偷,还是不偷
  2. 因此,可以得到,从第三栋开始,递推公式为偷或者不偷,选择最大值: F(n) = max( F(n-2)+nums[n] , F(n-1) )
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序(因为这个数列是一维的,只需要一重循环,无需考虑这个)
  2. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

在这里插入图片描述

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

在这里插入图片描述

class Solution {public int rob(int[] nums) {int length = nums.length;//有多少栋房子int dp[] = new int[length];//dp数组dp[0] = nums[0];//第一栋,只能选择偷它//第二栋可以选择偷(那么第一栋不能偷),或者不偷(只偷第二栋,第一栋不偷),无需考虑前面不相邻的if(length>=2) dp[1] = Math.max(nums[0],nums[1]);//第三栋开始,不仅仅要考虑偷还是不偷,还要考虑前面不相邻的for(int i = 2;i<length;i++){//如果这一栋不偷,则前面偷了多少就是多少,也就是到上一栋时,有多少就有多少===dp[i-1]//如果这一栋要偷,则前面不相邻的偷了多少 + 这一栋有多少 为偷完这一栋拿到的钱dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);//我们只考虑最大情况}return dp[length-1];//返回偷到最后一栋时,偷到的最大金额}
}
学有余力的同学可以尝试这个方法,将空间复杂度变为常数级-----------------代码:时间复杂度O(n).空间复杂度O(1)

将dp数组优化掉,换成3个变量,滚动执行。将dp[0]换成first。dp[1]换成second. 也就是first永远指向当前栋的前面不相邻的,second永远指向前面相邻的。
在这里插入图片描述

class Solution {public int rob(int[] nums) {int length = nums.length;//有多少栋房子int first = nums[0],second = nums[0];//第一栋,只能选择偷它//第二栋可以选择偷(那么第一栋不能偷),或者不偷(只偷第二栋,第一栋不偷),无需考虑前面不相邻的if(length>=2) second = Math.max(nums[0],nums[1]);//第三栋开始,不仅仅要考虑偷还是不偷,还要考虑前面不相邻的for(int i = 2;i<length;i++){int temp = second;second = Math.max(first+nums[i],second);//我们只考虑最大情况first = temp;}return second;//返回偷到最后一栋时,偷到的最大金额}
}

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

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

相关文章

Flink CDC 3.0 详解

一、Flink CDC 概述 Flink CDC 是基于数据库日志 CDC&#xff08;Change Data Capture&#xff09;技术的实时数据集成框架&#xff0c;支持全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合Flink 优秀的管道能力和丰富的上下游生态&#x…

开启Android学习之旅-1

最近在学习《第一行代码 Android》&#xff0c;两天看书把所有代码都敲了一遍。由于之前没有接触过 Kotlin&#xff0c;导致了囫囵吞枣&#xff0c;跟着书会敲&#xff0c;离开就忘了。Android 大佬开发的各种框架、控件好像大部分都用了 Kotlin。看他们的源码&#xff0c;理解…

【每日一题】7.LeetCode——合并两个有序链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

【issue-YOLO】自定义数据集训练YOLO-v7 Segmentation

1. 拉取代码创建环境 执行nvidia-smi验证cuda环境是否可用&#xff1b;拉取官方代码&#xff1b; clone官方代码仓库 git clone https://github.com/WongKinYiu/yolov7&#xff1b;从main分支切换到u7分支 cd yolov7 && git checkout 44f30af0daccb1a3baecc5d80eae229…

C++——日期类

前言&#xff1a;哈喽小伙伴们&#xff0c;在上一篇文章中我们对C类与对象的前半段知识进行了简单的分享&#xff0c;其中比较重要的莫过于C类的六个默认成员函数。 所以这篇文章&#xff0c;我们通过实现一个完整的日期的操作&#xff0c;来对这些成员函数有一个更加深入的理…

RabbitMQ-高级篇

服务异步通信-高级篇 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送…

Android 高德地图切换图层

一、默认样式 Android 地图 SDK 提供了几种预置的地图图层&#xff0c;包括卫星图、白昼地图&#xff08;即最常见的黄白色地图&#xff09;、夜景地图、导航地图、路况图层。 findViewById<TextView>(R.id.normal).setOnClickListener {updateSelectedStatus(TYPE_NORMA…

Glide完全解读

一&#xff0c;概述 glide作为android流行的图片加载框架&#xff0c;笔者认为有必要对此完全解读。glide提供了三级缓存、生命周期Destroy后自动移除缓存、自动适配ImageView&#xff0c;以及提供了各种对图片修饰的操作&#xff0c;如剪裁等。本文通过最简单的使用&#xff…

Vue(二十):ElementUI 扩展实现表格组件的拖拽行

效果 源码 注意&#xff1a; 表格组件必须添加 row-key 属性&#xff0c;用来优化表格的渲染 <template><el-row :gutter"10"><el-col :span"12"><el-card class"card"><el-scrollbar><span>注意: 表格组件…

自动化测试再升级,大模型与软件测试相结合

近年来&#xff0c;软件行业一直在迅速发展&#xff0c;为了保证软件质量和提高效率&#xff0c;软件测试领域也在不断演进。如今&#xff0c;大模型技术的崛起为软件测试带来了前所未有的智能化浪潮。 软件测试一直是确保软件质量的关键环节&#xff0c;但传统的手动测试方法存…

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中&#xff0c;使用 Shell 脚本可以为我们节省大量时间和精力。 文章将以输入 IP 为例&#xff0c;通过几个版本逐步完善一个案例。 原始需求 编写一个交互式的 Shell 脚本&#xff0c;运行时让用户可以输入IP地址&#xff0c;并且脚本会将输入…

国辰智企TMS定制化模块,实现智慧园区的全面管理

智慧园区综合管理系统是一种针对园区业务场景的高度定制化解决方案&#xff0c;通过选择性部署相应的模块&#xff0c;实现对园区各方面业务的全面管理。通常情况下&#xff0c;园区都需要有效地管理资产、确保安全&#xff0c;以及进行访客预约。这一全面性的系统通过各个模块…

windows 谷歌浏览器Chrome 怎么禁止更新

1.首先把任务管理器里的谷歌浏览器程序结束&#xff1a; &#xff08;鼠标在任务栏右击&#xff0c;出现任务管理器&#xff09; 2.windowr&#xff0c;输入services.msc 带有Google Update的服务&#xff0c;选择禁用。 3.windowr&#xff0c;输入taskschd.msc 任务计划程序…

二叉搜索树,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 代码实现(中序遍历)&#xff1a; 题目地址&#xff1a; 98. 验证二叉搜索树 - 力扣&#xff08;LeetCod…

delete、truncate和drop区别

一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx1.1、DELETE属于数据库DML操作语言&#xff0c;只删除数据不删除表的结构&#xff0c;会走事务&#xff0c;执行时会触发trigger&#xff08; 触发器…

8. 字符串转换整数 (atoi)-LeetCode(Java)

8. 字符串转换整数 (atoi) 题目&#xff1a;8. 字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入…

AI大语言模型学习笔记之三:协同深度学习的黑魔法 - GPU与Transformer模型

Transformer模型的崛起标志着人类在自然语言处理&#xff08;NLP&#xff09;和其他序列建模任务中取得了显著的突破性进展&#xff0c;而这一成就离不开GPU&#xff08;图形处理单元&#xff09;在深度学习中的高效率协同计算和处理。 Transformer模型是由Vaswani等人在2017年…

2024美赛预测算法 | 回归预测 | Matlab基于WOA-LSSVM鲸鱼算法优化最小二乘支持向量机的数据多输入单输出回归预测

2024美赛预测算法 | 回归预测 | Matlab基于WOA-LSSVM鲸鱼算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 2024美赛预测算法 | 回归预测 | Matlab基于WOA-LSSVM鲸鱼算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果…

Git 指令

Git 安装 操作 命令行 简介&#xff1a; Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion …

2024PMP考试新考纲-【业务环境领域】典型真题和很详细解析(2)

华研荟继续分享【业务环境Business Environment领域】在新考纲下的真题&#xff0c;帮助大家体会和理解新考纲下PMP的考试特点和如何应用所学的知识和常识&#xff08;经验&#xff09;来解题&#xff0c;并且举一反三&#xff0c;一次性3A通过2024年PMP考试。 2024年PMP考试新…