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

news/2024/4/26 4:19:48/文章来源:https://blog.csdn.net/kuiisy/article/details/129682145

LeetCode 198 打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/

思路:

  • dp数组的含义

dp[i]表示前i个房间(包括第i个房间)所能偷到的最大金额

  • 递推公式

有两种情况:

1、偷了第i个房间

那么此时第i-1个房间肯定是不偷的,所以

2、没有偷第i个房间

那么有可能偷了第i-1个房间,所以此时

因为求的是最大金额,所以二者要求最大值

  • 初始化

由递推公式可知,显然需要初始化dp[0]和dp[1],dp[0]=nums[0],dp[1]=max(nums[0],nums[1])

  • 遍历顺序

因为dp[i]依赖于dp[i-1]和dp[i-2],所以必然是从前往后遍历

代码:

class Solution {
public:int rob(vector<int>& nums) {if(nums.size() == 1)    return nums[0];vector<int>dp(nums.size(), 0);dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);for(int i = 2; i < nums.size(); i++){dp[i] = max(dp[i - 1],dp[i - 2] + nums[i]);}for(int i = 0; i < dp.size(); i++)cout << dp[i] << " ";cout << endl;return dp[nums.size() - 1];}
};

总结

自己写的时候,dp数组的含义定义错误了

LeetCode 213 打家劫舍II

题目链接:https://leetcode.cn/problems/house-robber-ii/

思路:

本题要分成两种情况来讨论:

1、考虑包含头元素,不包含尾元素

2、考虑包含尾元素,不包含头元素

最后求两种情况的最大值即为答案。

注:“考虑"不代表必须要选,例如情况二,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况二,取nums[1] 和 nums[3]就是最大的。

代码:

class Solution {
public:int rob(vector<int>& nums) {if(nums.size() == 1)    return nums[0];if(nums.size() == 2)    return max(nums[0], nums[1]);int result1 = robRange(nums, 0, nums.size() - 2);   // 不包含尾元素的情况int result2 = robRange(nums, 1, nums.size() - 1);   // 不包含头元素的情况return max(result1, result2);}int robRange(vector<int>&nums, int start, int end){vector<int>dp(nums.size(), 0);dp[start] = nums[start];dp[start + 1] = max(nums[start],nums[start + 1]);for(int i = 2; i <= end; i++){dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[end];}};

总结

学会了数组环形要如何解决

LeetCode 337 打家劫舍III

题目链接:https://leetcode.cn/problems/house-robber-iii/

思路:

  • dp数组的含义

dp[0]代表不偷该节点时的最大金额

dp[1]代表偷该节点时的最大金额

  • 遍历顺序

首先明确的是使用后序遍历。 因为要通过递归函数的返回值来做下一步计算。

通过递归左节点,得到左节点偷与不偷的金钱。

通过递归右节点,得到右节点偷与不偷的金钱。

  • 单层递归逻辑

1、不偷当前节点

那么此时就可以选择偷和不偷左右节点。

2、偷当前节点

那么就是选择不偷左右子树

  • 举例推导

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int rob(TreeNode* root) {vector<int>result = robTree(root);return max(result[0], result[1]);}vector<int> robTree(TreeNode *cur){if(cur == nullptr) return vector<int>(2, 0);// 后续遍历vector<int>leftdp = robTree(cur -> left);vector<int>rightdp = robTree(cur -> right);int val0 = max(leftdp[0], leftdp[1]) + max(rightdp[0], rightdp[1]);int val1 = cur->val + leftdp[0] + rightdp[0];return vector<int>{val0, val1};}
};

总结

dp和树结合的一道题

今日总结:

三道打家劫舍的题目对应了普通数组情况,环形情况和树形情况。其中环形情况和树形情况需要多加练习和理解。

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

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

相关文章

Python基础之操作mysql数据库

Python 标准数据库接口为 Python DB-API&#xff0c;Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库&#xff0c;你可以选择适合你项目的数据库&#xff1a;GadFlymSQLMySQLPostgreSQLMicrosoft SQL Server 2000InformixInterbaseOrac…

一、简单了解ElasticSearch

目录一、ElasticSearch简介1.ES与关系型数据库对比2.什么是全文检索3.分词原理&#xff08;基于倒排索引&#xff09;二、核心概念1.索引index2.映射mapping3.字段filed4.字段类型type5.文档document6.集群cluster7.节点node8.分片9.副本三、搭建es单机版、集群版1.搭建es2.集成…

项目质量管理工作 不得不重视的4大关键点

1、三大视角确保项目质量 我们需要从客户视角、SOW视角和组织视角三大视角&#xff0c;确保项目的质量。 从客户视角方面出发&#xff0c;满足客户的要求&#xff0c;如项目交付的准时性、项目质量的保证等。我们需要全力保障客户对项目质量的要求。 从SOW视角确保项目质量&…

ffpmeg笔记:(2)学习一个开源小demo:qt+sdl+ffmpeg,计算时间戳

文章目录前言1.源码和编译方法1.1编译方法&#xff1a;2.源码简单介绍2.1 播放线程类 PlayThread2.1.1 计算当前播放进度时间2.2 主界面类 MainWindow2.2.1 在Qt widget中显示视频2.2.2 控制区域的自动隐藏和再现前言 这个小demo实现了下面的功能&#xff1a; 1.打开文件。 2.…

操作系统(2.4.5)--管程机制

1.管程的定义 利用共享数据结构抽象地表示系统中的共享资源&#xff0c;而把对该共享数据结构实施的操作定义为一组过程进程对共享资源的申请、释放和其它操作&#xff0c;都是通过这组过程对共享数据结构的操作来实现的&#xff0c;这组过程还可以根据资源的情况&#xff0c;或…

跟着本文走,告诉你五类walmart最爱产品

在我们跨境圈一直流传着一句话&#xff0c;选品选的好啊&#xff0c;红利吃饱饱。选品的重要性相信不用龙哥多说&#xff0c;选品基本上就是决定了店铺的未来。好的选品不用愁流量、也不用担心走不长久。今天龙哥就来聊聊在walmart上&#xff0c;哪些选品是值得发展的。walmart…

synchronized 加锁 this 和 class 的区别

synchronized 是 Java 语言中处理并发问题的一种常用手段&#xff0c;它也被我们亲切的称之为“Java 内置锁”&#xff0c;由此可见其地位之高。然而 synchronized 却有着多种用法&#xff0c;当它修饰不同对象时&#xff0c;其意义也是不同的&#xff0c;下面我们一起来看。 ​…

实在智能RPA受邀出席2023年东莞市数字赋能峰会,聚力数智制造

3月17日&#xff0c;“数字东莞 科创强市2023年东莞市数字赋能峰会”在松山湖光大We谷圆满举行。本次大会以创新性、专业性、平台化、战略性等为特色&#xff0c;涵盖当今前沿技术、行业痛点、商业模式。会上中国信通院的专家分享了《东莞市数字经济发展报告&#xff08;2022年…

刷题day40:从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树

一、从中序与后序遍历序列构造二叉树 题意描述&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 需要利用后续遍历&#xff08;左右中…

java校园报修管理系统ssm

用户的主要功能有&#xff1a; 1.用户注册和登陆登陆系统 2.用户查看报修类型&#xff0c;在线申请报修信息 3.用户对报修信息进行评价 4.用户查看资讯公告信息 5.用户查看个人信息&#xff0c;修改个人信息&#xff0c;修改密码 6.用户在线提交意见反馈信息 7.用户查看报修记录…

记录一次接口套娃数据处理

由于后端接口设计历史遗留问题&#xff0c;要求在一个接口中&#xff0c;通过他返回的数据去请求其他接口&#xff0c;数据以表格的形式渲染出来 目录 前言 一、每次仅展示一个步骤图 二、整合接口数据&#xff0c;一次性渲染 1.请求步骤条接口的地方对数据进行处理 2.修改…

完全小白的pycharm深度学习调试+for循环断点条件设置

完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…

简单分析Linux内核基础篇——initcall

写过Linux驱动的人都知道module_init宏&#xff0c;因为它声明了一个驱动的入口函数。 除了module_init宏&#xff0c;你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数&#xff0c;而是看到了许多诸如以下的声明&#xff1a; static int __init qco…

C++基础算法③——排序算法(选择、冒泡附完整代码)

排序算法 1、选择排序 2、冒泡排序 1、选择排序 基本思想&#xff1a;从头至尾扫描序列&#xff0c;每一趟从待排序元素中找出最小(最大)的一个元素值&#xff0c;然后与第一个元素交换值&#xff0c;接着从剩下的元素中继续这种选择和交换方式&#xff0c;最终得到一个有序…

Redis(十四)【Redisson分布式锁基础介绍】

分布式锁 Redisson 一、Redisson 概述 什么是 Redisson Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。 Redisson 的宗旨是促进使…

【数据分析之道①】字符串

文章目录专栏导读1、字符串介绍2、访问字符串中的值3、字符串拼接4、转义字符5、字符串运算符6、字符串格式化7、字符串内置函数专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之…

SpringCloud:初识RabbitMQ及快速入门

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但…

每个开发人员都需要掌握的10 个基本 SQL 命令

SQL 是一种非常常见但功能强大的工具&#xff0c;它可以帮助从任何数据库中提取、转换和加载数据。数据查询的本质在于SQL。随着公司和组织发现自己处理的数据量迅速增加&#xff0c;开发人员越来越需要有效地使用数据库来处理这些数据。所以想要暗恋数据领域&#xff0c;SQL是…

数据挖掘(作业汇总)

目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例&#xff1a; 1、安装anaconda&#xff1a;&#xff08;anaconda自带Python,安装了anaconda就不用再安装Python了&#xff09; 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…

分片压缩、分片上传,融云 IM 视频文件高速传输方案

在 IM 消息管理中&#xff0c;多种类型消息的传输处理是服务可靠性的关键。关注【融云全球互联网通信云】了解更多 通常&#xff0c;发送消息前&#xff0c;融云 IM 会将发送的媒体文件上传到默认文件服务器。 而在文本、表情、图片、语音、位置、小视频等各种消息中&#xf…