代码随想录算法训练营第四十八天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III

LeetCode198.打家劫舍

动态规划五部曲:

1,确定dp数组(dp table)以及下标的含义:dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]

2,确定递推公式:决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点)然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

3,dp数组如何初始化:从递推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);可以看出,递推公式的基础就是dp[0] 和 dp[1]。从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);

4,确定遍历顺序:dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历!

5,举例推导dp数组:以示例二,输入[2,7,9,3,1]为例。

 Java代码如下:

    public int rob(int[] nums) {if (nums == null || nums.length == 0) return 0;if (nums.length == 1) return nums[0];int[] dp = new int[nums.length];dp[0] = nums[0];dp[1] = Math.max(dp[0], nums[1]);for (int i = 2; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[nums.length - 1];}

LeetCode213.打家劫舍II

基本思路:这道题目与打家劫舍1的区别就是成环了。

对于一个数组,成环的话主要有如下三种情况:

情况一:考虑不包含首尾元素:

情况二:考虑包含首元素,不包含尾元素1

 

情况三:考虑包含尾元素,不包含首元素

 

注意这里用的是"考虑",例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了。剩下的就和打家劫舍1一样了。

Java代码如下:

    public int rob(int[] nums) {if (nums == null || nums.length == 0)return 0;int len = nums.length;if (len == 1)return nums[0];return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));}int robAction(int[] nums, int start, int end) {int x = 0, y = 0, z = 0;for (int i = start; i < end; i++) {y = z;z = Math.max(y, x + nums[i]);x = y;}return z;}

LeetCode337.打家劫舍III

和前两题的区别就是变成了树 

动态规划五部曲:

1,确定递归函数的参数和返回值:这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。其实这里的返回数组就是dp数组。所以dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。所以本题dp数组就是一个长度为2的数组!长度为2的数组怎么标记树中每个节点的状态呢?别忘了在递归的过程中,系统栈会保存每一层递归的参数。

2,确定终止条件:在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回。

3,确定遍历顺序:首先明确的是使用后序遍历。 因为要通过递归函数的返回值来做下一步计算。通过递归左节点,得到左节点偷与不偷的金钱。通过递归右节点,得到右节点偷与不偷的金钱。

 4,确定单层递归的逻辑:如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (如果对下标含义不理解就再回顾一下dp数组的含义)。如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:

        val2 = max(left[0], left[1]) + max(right[0], right[1]);

最后当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}。

5,举例推导dp数组:以示例1为例,dp数组状态如下:(注意用后序遍历的方式推导

 最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱

Java代码如下:

    public int rob(TreeNode root) {int[] res = robAction1(root);return Math.max(res[0], res[1]);}int[] robAction1(TreeNode root) {int res[] = new int[2];if (root == null)return res;int[] left = robAction1(root.left);int[] right = robAction1(root.right);res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);res[1] = root.val + left[0] + right[0];return res;}

 

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

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

相关文章

MockServer 服务框架设计

【摘要】 大部分现有的 mock 工具只能满足 HTTP 协议下简单业务场景的使用。但是面对一些复杂的业务场景就显得捉襟见肘&#xff0c;比如对 socket 协议的应用进行 mock&#xff0c;或者对于支付接口的失败重试的定制化 mock 场景。为解决上述问题&#xff0c;霍格沃兹测试学院…

压力测试遭遇大量TIME_WITE之后(这样解决)

前言&#xff1a;http协议是互联网中最常使用的应用层协议&#xff0c;它的绝大多数实现是基于TCP协议的。 目录 一 问题描述 二 问题跟踪 三 跟进分析 四 解决方法 一、问题描述 某天&#xff0c;在对一个提供http接口的后台服务进行压力测试过程中&#xff0c;我们设定了…

IPAD、IOS、MAC邮件配置QQ邮箱

1、登录QQ邮箱 2、点击设置 3、切换到账号&#xff0c;往下拉开启IMAP/SMTP服务&#xff0c;如果已经开启直接点击生成授权码即可 4、按照指示发送短信&#xff0c;验证成功后会有一段码&#xff0c;此为密码&#xff0c;按照下图配置即可

mac强制退出应用

第一种方法&#xff1a;通过键盘强制退出当前能够响应的 Mac 应用。 按住 Command Option Shift Esc 键一两秒&#xff0c;直到应用被强制退出。这是退出有前台界面的应用的最快方法了。 第二种方法&#xff1a;调出“强制退出应用”窗口。 按下 Command Option Esc 键&…

公司招人面试了一个00后,绝对能称为是内卷届的天花板

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。令我印象最深的是一个00后测试员&#xff0c;他…

Mac上QQ电话录音

在Mac上使用QQ电话时&#xff0c;需要同时记录下双方的声音。最后找到了loopback这个软件&#xff0c;配合Mac自带的QuickTime Player来实现需求。 QQ for Mac上的通话机制有两点需要注意&#xff1a; 一旦QQ电话开始&#xff0c;再在设置里手动更改声音输入设备是无效的QQ电…

Mac 前端开发之旅

目录 Mac 浏览器内常用快捷键 在 Mac 上打开 “终端” Mac 之 Vue.cli4.X 项目搭建 Mac 超好用的软件 最近新上手了 Mac 本 &#xff0c; 一些操作啥的都还不习惯 &#xff0c; 在这里就是记录给自己看的一些使用 Mac 进行前端开发过程中的不会之处 Mac 浏览器内常用快捷键…

Mac 安装Git

使用mac安装git有两种方法&#xff0c;一种是mac自带的git&#xff0c;但是我看APP Store中评论不好。另一个是Git自己管理的软件&#xff0c;我使用的是这种。 1. 下载Git安装包&#xff08;https://git-scm.com/download/mac&#xff09; 下载完成之后&#xff0c;点击Finde…

三面阿里被挂,竟获内推名额,历经 5 面拿下口碑 offer...

每一个互联网人心中都有一个大厂梦&#xff0c;百度、阿里巴巴、腾讯是很多互联网人梦寐以求的地方&#xff0c;而我也不例外。但是&#xff0c;BAT 等一线互联网大厂并不是想进就能够进的&#xff0c;它对人才的技术能力和学历都是有一定要求的&#xff0c;所以除了学历以外&a…

windows注册表恢复方法

如果可以进入安全模式&#xff0c;您可以在安全模式内调用命令提示符输入命令修复一下系统组件。 在管理员命令提示符下键入以下命令&#xff1a; Dism /Online /Cleanup-Image /ScanHealth 这条命令将扫描全部系统文件并和官方系统文件对比&#xff0c;扫描计算机中的不一致…

电脑注册表误删恢复办法:系统文件和设置还原法

一.起因&#xff1a;为了修改电脑字体一不小心把Control Panel整个注册表给删除了&#xff0c;导致电脑界面变的锯齿&#xff0c;界面变形等各种问题&#xff0c;网上找了许多方法都没成功或者难度较大&#xff0c;最终使用系统恢复还原点将系统变成几个小时前的各种设置&#…

计算机卸载打不开,注册表删了电脑打不开如何修复

注册表删了电脑打不开如何修复 电脑的注册表主要是指注册表编辑器&#xff0c;注册表编辑器主要是用于设置电脑硬件和软件的&#xff0c;是一个比较重要的文件夹。但是有些人因为错误的操作导致注册表编辑器不能正常的打开&#xff0c;甚至是无法打开。大家知道注册表编辑器如何…

Windows误删注册表恢复方法

昨天不小心把注册表给删了,期间一直找解决方法,因为没有usb等重装工具... 我把注册表的HKEY_LOCAL_MACHINE\software这个重要的东西给误删了 ---结果就是软件打不开.就连删除东西都没用,自带的cmd什么的系统工具打不开... 关机重启问题更严重了,直接蓝屏,但是还好,开机的时候…

修复注册表的方法

Windows系统上&#xff0c;注册表是用来存储应用软件重要配置信息的&#xff0c;注册表的丢失可能会导致软件无法使用。下面来介绍几种常用的修复注册表的方法。 使用注册表编辑器 使用winR来调出控制台&#xff0c;在输入regedit就可以调出注册表编辑器了&#xff0c;用户可以…

电脑键盘注册表已损坏导致无法输入信息的修复方式

场景&#xff1a; 最近台式机电脑系统炸裂&#xff0c;发现机械硬盘也无法重装系统&#xff0c;故换了新硬盘&#xff0c; 同时安装常用软件&#xff0c;其中有一款软件强行进行安装&#xff0c;提示注册表无权限配置&#xff0c; 想着测试也能正常使用&#xff0c;就没管&a…

Windows 7 出现 0xc0000014c 注册表损坏 修复问题

此方法&#xff0c;不用重装系统&#xff0c;完美解决问题&#xff0c;刚刚亲测有效&#xff0c;分享一下 PE一共是500多M&#xff0c;所以一个1G的就够了&#xff0c;但是考虑到操作系统同时在上面&#xff0c;win7 64位系统&#xff0c;一般是3.7-4G&#xff0c;最少4G&…

电脑注册表修复清理,以及运行库修复

相信大家好多人都会遇到软件安装的时候很顺利,但是卸载重装的时候却出现安装不上,或着无法清理干净,也有另一种情况是安装一些大型单机游戏时候会需要一些运行库,不然的话总是不能运行,提示缺少各种运行库文件,最终好多人只有选择重装系统,或者找大神帮忙,这里呢,我给…

修复Windows10系统的注册表?

在打开的管理员命令提示符窗口&#xff0c;输入如下命令&#xff1a; ———————————————————————————————— reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsSelfHost\Applicability" /v "BranchName" /d &qu…

Windows 10注册表损坏怎么办?

注册表是一个复杂的数据库&#xff0c;如果不进行维护&#xff0c;它就会填充损坏的和孤立的注册表项。尤其是对Windows进行升级时&#xff0c;损坏或丢失的注册表项也会不断累积&#xff0c;从而影响您的系统性能。如果您的Windows 10系统正在经历注册表损坏的问题&#xff0c…

注册表中exe被删除后恢复

恢复注册表 如果我们不小心将注册表中的exe删除后&#xff0c;这个时候不管打开什么软件都需我们自己进行指定才能打开使用&#xff0c;这样是及其麻烦的&#xff0c;而且在删除掉.exe之后&#xff0c;原来能在“运行”中搜索的执行文件也都无法执行了&#xff0c;比如果原来我…