第41天|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍II、LeetCode337. 打家劫舍III

news2024/10/5 17:21:57

1.题目链接:198. 打家劫舍

题目描述:

                你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

                给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

解法:

        1.五部曲:

                        ①首先此题判断哪家可以不可以偷是根据前面的状态来判断的,所以存在状态转移,用动态规划来做。

                        ②确定dp[i]的含义,即考虑包括下标i和i之前的位置能偷窃到的最高金额为dp[i]

                        ③递推公式:dp[i] = ? 可以分为两种情况即偷与不偷。如果偷的话 = dp[i-2] + nums[i].如果不偷的话 = dp[i-1]。故递推公式dp[i] = max(dp[i-1], dp[i-2] + nums[i])

                        ④初始化:因为根据递推公式要根据前两个值来求,所以初始化dp[0] = nums[0], dp[1] = max(nums[0], nums[1])。其余位置的初始化任何都可以,因为当前位置的值只通过前面的值推导出来的,所以其余的值无所谓。

                        ⑤遍历顺序:因为是根据前面的值推导的,所以遍历顺序从小到大。

                        ⑥最后返回dp[nums.length-1];

        2.步骤:

                        ①if nums.length == 1,返回nums[0]。---如果没有这部的话,在初始化数组的时候会越界

                        ②创建dp数组,长度为nums.length

                        ③初始化:dp[0] = nums[0] ,dp[1] = max(nums[0], nums[1]);

                        ④遍历:for(i = 2~nums.length){dp[i] = max(dp[i-2] + nums[i], dp[i-1]);}

                        ⑤最后return dp[nums.length-1]

下面为代码(java):

2.题目链接:213. 打家劫舍 II 

题目描述:

        你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

        给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

解法:

        1.五步曲:

                        ①此题和打家劫舍I的区别就是,这次的房屋是个环形了,应该怎么处理?

                        ②可以分三种情况考虑:

                                                        1)不考虑头和尾,就是打家劫舍问题。

                                                        2)考虑头不考虑尾,就是打家劫舍问题。

                                                        3)考虑尾不考虑头,就是打家劫舍问题。

                                                        4)同时第一种情况被第二和第三种都包含,所以一共就是两种情况最后取最大值即可。

        2.步骤:

                        ①在主函数中:if(nums.length == 1){return nums[0];}

                        ②然后写一个函数实现打家劫舍:

                                1)此时我们可以优化代码:即就相当于维护三个变量,即相邻的三个数。有点像斐波那契数列的优化。

                                2)参数就是数组,start 和 end;返回值类型就是int型

即定义 x = 0 --- 表示第一个数的值;定义y = 0 --- 表示第二个数的值;定义z = 0 --- 表示第三个数的值。

                                3)遍历:for(i = start;i < end;i++ ){

                                                                y = z;

                                                                z = Math.max(y, x + nums[i]);

                                                                x = y;}

                                4)可能会有点疑惑,其实第一步和第二步就是求length = 1和2的结果第二步的时候完成了dp[0]的初始化第三部开始完成了dp[1]的初始化,然后开始计算dp[i]。

                                5)最后返回z

                                6)最后在主函数中调用helper(nums, 0, nums.length-1)和helper(nums, 1, nums.length)并将他们俩进行比较即取最大值,返回最大值即可。

下面为代码(java):

3.题目链接:337. 打家劫舍 III 

题目描述:

                小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

                除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

                给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 

解法:

        1.五步曲:

                        ①此题就是将可偷的地区变成了一颗树型。那么我们要考虑树就要考虑递归三步

                        ②同时这是状态转移的题,所以要考虑动态规划,故交叉考虑即可。

                        ③首先确定dp[]数组,即dp数组是个一维数组,且只有两个元素,dp[0]表示的是当前节点不偷了获得的最高金额dp[1]表示的是当前节点偷了获得的最高金额。即递归函数的返回值就是int[],参数就是TreeNode.

                        ④确定递推公式:dp[0] = max(leftdp[0], leftdp[1]) + max(rightdp[0], rightdp[1]);

                                                     dp[1] = cur.val + leftdp[0] + rightdp[0];

                        ⑤根据递推公式可以知道,我们要根据左右孩子的状态来确定当前节点的状态,所以遍历顺序就是左右中。

                        ⑥终止条件? 当遍历到空节点的时候,return{0,0};

                        ⑦最后返回的是就是根节点处的状态值数组,因为整个树是从下到上去反馈结果的,所以最后return dp;

        2.步骤:

                        ①写一个递归函数,参数 TreeNode cur,返回值类型 int[]{

                        ②创建dp[]= new int[2] --- 即长度为2的数组

                        ③if(cur == null){return dp;} --- 就相当于返回了{0,0},因为根本没有进行修改初始值就是0.

                        ④按左右中的顺序遍历即:

                                                        int[] leftdp = helper(cur.left);

                                                        int[] rightdp = helper(cur.right);

                                                        dp[0] = max(leftdp[0], leftdp[1]) + max(rightdp[0], rightdp[1]);

                                                        dp[1] = cur.val + leftdp[0] + rightdp[0];

                        ⑤最后返回dp。然后在主函数中用result数组承接递归函数的返回值,再return max(result[0], result[1])就是最终结果。

下面为代码(java):

4.总结:

                ①三题都是抢劫问题,都是相邻的不能抢,不同的就是地方的布局不同,一个是线性的,一个是环型的,一个是树型的。

                ②对于线性和环形问题:当前获得的钱数根据相邻的前两个来确定递推公式。而环形问题可以拆成线性问题来解决。对于树形问题:当前获得的最大钱数根据左右孩子的状态来获得。

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

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

相关文章

Ubuntu中利用aircrack-ng和Wireshark抓空口包

系统&#xff1a;Ubuntu20.04网卡&#xff1a;RTL8188CUS USB网卡工具安装sudo apt-get install aircrack-ngsudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt install -y wireshark网卡确认网卡是否支持monitor模式&#xff0c;输入iw list命令&am…

Java最全八股文(2023最新整理)

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

vTESTstudio - VT System CAPL Functions - VT2004

纵使生活有白般不顺&#xff0c;我们依然要千般喜乐&#xff0c;万般热爱&#xff0c;只因那些我们喜爱和爱我们的人儿。vtsLoadWFResistance - 从指定文件加载通道的电阻曲线功能&#xff1a;此函数从指定文件加载VT2004通道的电阻曲线注意&#xff1a;该函数不能在任何CAPL处…

电子技术——分立CS和CE放大器的低频响应

电子技术——分立CS和CE放大器的低频响应 我们之前在学习放大器中从来没有关系过信号频率对放大器的影响&#xff0c;也就是说我们默认放大器具有无限的带宽&#xff0c;这当然不符合现实逻辑。为了说明这一点&#xff0c;我们使用下图&#xff1a; 上图描述了MOS或BJT分立电路…

电脑录屏是哪个快捷键?3个录屏快捷键,教你快速录屏

在每天的办公、学习、生活中&#xff0c;很多小伙伴经常需要使用电脑录屏功能。想要快速进行电脑录屏&#xff0c;那么就需要使用电脑录屏的快捷键进行协助。电脑录屏是哪个快捷键&#xff1f;今天&#xff0c;小编就分享3个录屏快捷键&#xff0c;教你如何快速录屏。 一、电脑…

C语言格式化输入和输出; Format格式化

Format格式化 %1s或者%2s,%3s:取字符串的前1,2或者3位。%*c:屏蔽一个字符。%[A-Z]:取一个A到Z的值。 %[^a-z]:不取a到z的值。 %[^\n]&#xff1a;取非换行之前的值。printf("%5d", a):左边补 格式化&#xff1a;有正则在其中。 int main() {printf("%5d\n&quo…

二叉树讲解

对于二叉树&#xff0c;是真正的很难&#xff01;很难&#xff0c;不是一般的难度&#xff01;&#xff01;笔者学习完二叉树&#xff0c;笔记记录了得有三十多页&#xff0c;但是&#xff0c;还是很不理解&#xff08;做题不怎么会&#xff09;下面进入二叉树的基础部分&#…

无法决定博客主题的人必看!如何选择类型和推荐的 5 种选择

是否有人不能迈出第一步&#xff0c;因为博客的类型还没有决定&#xff1f;有些人在出发时应该行动&#xff0c;而不是思考&#xff0c;但让我们冷静下来&#xff0c;仔细想想。博客的难度因流派而异&#xff0c;这在很大程度上决定了随后的发展。因此&#xff0c;在选择博客流…

关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红

关于IDM下载器&#xff0c;提示&#xff1a;一个假冒的序列号被用来注册……到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件&#xff08;如果没有修改的权限就右键属性hosts文件修改user的权限为完全控制&#xff09;&#xff0c;在hosts里面增加以下内容&#xf…

RadGraph: Extracting Clinical Entities and Relations from Radiology Reports代码

文章来源&#xff1a;NeurIPS 文章类别&#xff1a;IE(Information Extraction) RadGraph主要基于dygie&#xff0c;主要文件为inference.py。 inference.py&#xff1a; 1、get_file_list(data_path) def get_file_list(path):file_list [item for item in glob.glob(f&q…

遮挡贴图(Occlusion Map)和微表面贴图(Microsurface Map)

遮挡贴图&#xff08;Occlusion Map&#xff09; 在3D图形学中&#xff0c;遮挡&#xff08;Occlusion&#xff09;是指光被物体挡住。即便是在PBR中&#xff0c;环境光在某些应该被遮挡的地方&#xff0c;也会以古怪的方式被反射。遮挡贴图&#xff08;Occlusion Map&#xff…

ffmpeg h264文件转mp4

h264文件不能直接在网页上播放&#xff0c;比如在浏览器上输入http://10.0.0.2/2022-01-08T22-32-58.h264&#xff0c;变成了下载。 若在浏览器上输入http://10.0.0.2/2022-01-08T22-32-58.mp4&#xff0c;则可以播放。 本文讲解用ffmpeg将h264文件转换成mp4。 首先&#xf…

视频融合 flv流格式对接(上)

FLV 是FLASH VIDEO的简称&#xff0c;FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快&#xff0c;使得网络观看视频文件成为可能&#xff0c;它的出现有效地解决了视频文件导入Flash后&#xff0c;使导出的SWF文件体积庞大&#xf…

R-Drop: Regularized Dropout for Neural Networks 论文笔记(介绍,模型结构介绍、代码、拓展KL散度等知识)

目录前言一、摘要二、R-Drop介绍三、R-Drop公式详解四、R-Drop计算流程附录0&#xff1a;代码附录一&#xff1a;熵以及信息熵附录二&#xff1a;KL散度&#xff08;相对熵&#xff09;附录三&#xff1a;JS散度附录四&#xff1a;互信息总结前言 R-Drop——神经网络的正则化Dr…

必看!Salesforce管理员职场如何快速晋升?

2023年的开局略显艰难&#xff0c;在当前的经济环境下&#xff0c;许多行业仍面临挑战。虽然交易周期可能会变得更长&#xff0c;但对新的Salesforce实施仍有巨大需求&#xff0c;现有客户仍然需要经验丰富的专业人员来优化和维护他们的Salesforce组织。 在过去的三年中&#x…

大规模即时云渲染技术,追求体验与成本的最佳均衡

现实世界映射其中&#xff0c;传统文化沉浸其境&#xff0c;旧时记忆交互其间。 仲升&#xff5c;技术作者 IMMENSE&#xff5c;内容编辑 在刚刚过温的春节&#xff0c;云之上&#xff0c;带来了一场「数字文化」新体验。 游花车、舞狮子、踩高跷、放烟花、写福字……还记得儿…

2023最强软件测试面试题,精选100 道,内附答案版,冲刺金3银4

精挑细选&#xff0c;整理了100道软件测试面试题&#xff0c;都是非常常见的面试题&#xff0c;篇幅较长&#xff0c;所以只放出了题目&#xff0c;答案在评论区&#xff01; 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有…

css复习3

精灵图的使用 为了有效地减少服务器接收和发送请求的次数&#xff0c;提高页面的加载速度&#xff0c;出现了 CSS 精灵技术&#xff08;也称 CSS Sprites、CSS 雪碧&#xff09;。 核心原理&#xff1a;将网页中的一些小背景图像整合到一张大图中 &#xff0c;这样服务器只需要…

新S/MIME标准将于今年九月生效

1月份&#xff0c;行业领导者通过了新的 S/MIME基线要求&#xff0c;旨在规范全球范围内公开信任电子邮件签名证书的颁发和管理。以下是关于此次更新的重点……根据abnormal security发布的报告称&#xff0c;近92%的受访者表示&#xff0c;他们在过去一年中至少经历过一次或多…

全网最全的Ansible中常用模块讲解

目录 前言 一、ansible实现管理的方式 二、Ad-Hoc执行方式中如何获得帮助 三、ansible命令运行方式及常用参数 四、ansible的基本颜色代表信 五、ansible中的常用模块 1、command 2、shell 3、script 4、copy 5、fetch 6、file 7、 unarchive 8、archive 9、h…