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

news2024/11/17 7:17:44

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://www.coloradmin.cn/o/611868.html

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

相关文章

【初识Spring框架】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. Spring框架是什么&#xff1f; 2. IOC 容器…

[Flink] Flink On Yarn(yarn-session.sh)启动错误

在Flink上启动 yarn-session.sh时出现 The number of requested virtual cores for application master 1 exceeds the maximum number of virtual cores 0 available in the Yarn Cluster.错误。 版本说明&#xff1a; Hadoop&#xff1a; 3.3.4 Flink&#xff1a;1.17.1 问题…

锐捷AC的部署实例

进行锐捷AC部署时&#xff0c;遇到了一些问题&#xff0c;遂记录下来&#xff0c;如若大家在项目过程中遇到类似问题可以对照解决。 写在前面&#xff08;锐捷AC的基础配置&#xff09; ac-controller //配置AC的capwap源地址信息&#xff0c;国家码等…

[操作系统]1.计算机系统概述

写在前面:这篇是为了复习基础知识准备的,而不是根据学校的教材走的,所以叙述有些出入的地方请见谅,该系列旨在快速梳理操作系统的基础知识和一些常见的问题点,知识框架来自于王道操作系统,后续有机会的话会继续补充 1.操作系统的基本概念 一个计算机系统可以自上而下分成四个…

go 流媒体服务搭建-01

这里写自定义目录标题 go 流媒体服务搭建-01 go 流媒体服务搭建-01 新建go 项目&#xff0c;配置go 版本1.19 新增main.go package mainfunc main() {}新增go.mod 文件 go mod init mym7s导入m7s 主包 go get m7s.live/engine/v4查看go.mod 文件 发现下载了一段的依赖包&…

2023年面试工具篇Postman面试题及答案

1. 说下你对Postman的了解&#xff1f; Postman是一种接口调试与http接口测试的工具。我们可以非常方便的用来模拟get或者post或者其他方式的请求来调试和测试接口。 Postman 的优点 •支持各种的请求类型: get、post、put、patch、delete 等 •支持在线存储数据&#xff0c;…

如果你当架构师,从0开始,如何做一个后台项目的架构?

前言 在40岁老架构师 尼恩的读者社群(50)中&#xff0c;很多小伙伴要拿高薪&#xff0c;这就要面试架构师&#xff0c;要完成架构的升级&#xff0c;进入架构赛道。 在架构师的面试过程中&#xff0c;常常会遇到下面的问题&#xff1a; 如果给你一个项目要你从0到1做架构&…

Python入门教程+项目实战-13.2节-集合的操作方法

目录 13.2.1 集合的常用操作方法 13.2.2 集合的查找 13.2.3 集合的添加 13.2.4 集合的删除 13.2.4 集合运算 13.2.5 知识要点 13.2.6 系统学习python 13.2.1 集合的常用操作方法 集合类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff…

怎么把投票链接生成二维码投票链接怎么生成二维码

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

ASEMI代理英飞凌IPA50R190CE,MOS管IPA50R190CE参数

编辑-Z IPA50R190CE参数描述&#xff1a; 型号&#xff1a;IPA50R190CE 持续漏极电流&#xff1a;24.8A 脉冲漏极电流&#xff1a;63A 栅极-源极电压&#xff1a;20V 功耗&#xff1a;32W 操作和储存温度&#xff1a;-40~150℃ 连续二极管正向电流&#xff1a;8.1A 漏…

5月VR大数据:Quest 2下跌超1%,其它变化不大

Hello大家好&#xff0c;每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么&#xff1f;关注这里就对了。我们会统计Steam平台的用户及内容等数据&#xff0c;每月初准时为你推送&#xff0c;不要错过喔&#xff01; 本数据报告包含&#xff1a;Steam VR硬…

excel相同内容单元格数值等于固定值怎么做?

如下表&#xff0c;让该表格所有“苹果”内容的单价都等于D3的20元&#xff0c;怎么批量操作&#xff1f; 可以使用Excel的条件格式功能来实现该需求&#xff0c;具体步骤如下&#xff1a; 1. 选中表格中所有的“苹果”单元格&#xff0c;可以使用鼠标拖动或者按住Ctrl键单击选…

javaScript蓝桥杯----大电影

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 一千个人眼里就有一千个哈姆雷特&#xff0c;小蓝最近痴迷于电影&#xff0c;但无奈学习任务繁重&#xff0c;只好先将电影收藏起来&#xff0c;留着以后观看&#xff0c;但是电影网站的收藏功能居然失效了&#xff0…

Spring架构篇--2.7 远程通信基础--使用Netty

前言&#xff1a;Netty 作为Nio 模型的实现&#xff0c;相较于Selector &#xff0c;进一步将api进行封装&#xff0c;使用更加的简单&#xff1b;在平常的开发中会发现许多组件的底层通信都使用了Netty&#xff0c;所以就非常有必要对Netty 的使用以及其工作原理进行了解了。 …

改进YOLOv8 | 主干网络篇 | YOLOv8 更换骨干网络之 GhostNet | 从廉价操作中获取更多特征

论文地址:https://arxiv.org/abs/1911.11907 代码地址:https://github.com/huawei-noah/ghostnet 由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络(CNN)很困难。特征图中的冗余是那些成功的神经网络的重要特征,但在神经架构设计中很少研究。本文提出了一种新的G…

JVM学习笔记二

1. JVM内存参数 要求 熟悉常见的 JVM 参数&#xff0c;尤其和大小相关的 堆内存&#xff0c;按大小设置 解释&#xff1a; -Xms 最小堆内存&#xff08;包括新生代和老年代&#xff09; -Xmx 最大堆内存&#xff08;包括新生代和老年代&#xff09; 通常建议将 -Xms 与 -…

【复杂网络建模】——基于微博数据的影响力最大化算法(PageRank)

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

pdf怎么转换成word?一分钟解决

PDF文件是一种广泛使用的电子文档格式&#xff0c;因为它们可以保留文档的完整性和格式。但是&#xff0c;有时候我们需要对PDF文件进行编辑和修改&#xff0c;这时候就需要将其转换成Word格式。在本篇文章中&#xff0c;我们将讨论PDF转换Word的方法及其优缺点。 有很多在线工…

易点易动打通财务系统,打破数据孤岛,实现固定资产的账实一致

固定资产管理涉及资产的采购、验收、账务处理、折旧管理等全流程,同时也牵涉到财务系统和资产系统两大信息孤岛。这两个系统之间数据不互通,导致资产的账实信息无法同步,无法真正实现资产管理的账实一致。 固定资产系统作为固定资产管理的业务系统,负责资产的采购申请、验收入…

IDEA2023.1配置Git

一、前言 在使用新设备整理git项目时&#xff0c;报了以下问题&#xff0c;在整理项目的同时&#xff0c;做下记录。 二、下载git 2.1.官网下载git 官网下载地址&#xff1a; git官网&#xff0c;如下图所示&#xff1a; 如果选方法二&#xff0c; 接下来会让选择系统&#…