day 48 打家劫舍专题:198. 打家劫舍;213. 打家劫舍 II;337. 打家劫舍 III

news2024/11/24 18:57:49

打家劫舍

  • 198. 打家劫舍
    • 1. dp数组以及下标名义
    • 2. 递归公式
    • 3. dp数组如何初始化
    • 4. 遍历顺序
    • 5. 代码
  • 213. 打家劫舍 II:房间首尾相连
    • 1. dp数组以及下标名义
    • 2. 递归公式
    • 3. dp数组如何初始化
    • 4. 遍历顺序
    • 5. 代码
  • 337. 打家劫舍 III:
    • 1. 递归,后序遍历
    • 动态规划:树形dp的入门题目
      • 1.确定递归函数的参数和返回值
    • 2. 确定终止条件
    • 3. 确定遍历顺序
    • 4. 确定单层递归的逻辑
    • 5. 代码

198. 打家劫舍

如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

在这里插入图片描述

1. dp数组以及下标名义

dp[i] : 考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]

2. 递归公式

dp[1] = 2;
dp[2]=7;
dp[3]=2+9;
偷第i间:dp[i] = dp[i - 2] +nums[i]
不偷第i间:dp[i] = dp[i - 1]
dp[i]=max(dp[i - 1],dp[i - 2] +nums[i])

3. dp数组如何初始化

dp[0]=0

4. 遍历顺序

5. 代码

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size() == 0)return 0;
        if(nums.size() == 1)return nums[0];
        vector<int>dp(nums.size() + 2, 0);
        dp[1] = nums[0];//从下标1开始算1号房间,不要0下标
       // dp[2] = max(nums[0], nums[1]);
        for (int i = 2; i <= nums.size(); i++) {
            dp[i] = max(dp[i - 2] + nums[i - 1], dp[i - 1]);
        }
        return dp[nums.size()];
    }
};

213. 打家劫舍 II:房间首尾相连

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

  1. 情况一:考虑不包含首尾元素
    在这里插入图片描述
    2.考虑包含首元素,不包含尾元素
    在这里插入图片描述
  2. 情况三:考虑包含尾元素,不包含首元素
    在这里插入图片描述只需要考虑情况二和情况三,因为这两种情况包含了情况一

1. dp数组以及下标名义

dp[i] : 考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]

2. 递归公式

dp[i]=max(dp[i - 1],dp[i - 2] +nums[i])

3. dp数组如何初始化

dp[0]=0

4. 遍历顺序

5. 代码

class Solution {
public:
    int getrob(vector<int>& nums, int start, int end) {
        vector<int >dp(nums.size() + 1, 0);//要用nums.size() + 1 
        dp[start + 1] = nums[start ];
        for(int i = start + 2; i <= end; i++) {
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
        }
        return dp[end];
    }
       int rob(vector<int>& nums) {
           if(nums.size() == 0) return 0;
           if(nums.size() == 1) return nums[0];
           if(nums.size() == 2) return max(nums[0], nums[1]);
          int ahead = getrob(nums, 0 , nums.size() - 1);
           cout<<ahead<<endl;
          int backhead = getrob(nums, 1 , nums.size());
           cout<<backhead<<endl;
           return max(ahead, backhead);
       }
};

337. 打家劫舍 III:

在这里插入图片描述

1. 递归,后序遍历

/**
 * 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:
    map<TreeNode* , int>umap;
    int rob(TreeNode* root) {
        if(root == nullptr)return 0;
        if(root->left == nullptr && root->right ==nullptr) return root->val;
        if(umap[root]) return umap[root];
        //偷父节点
        int val1 = root->val;
        if(root->left)val1 += rob(root->left->left) + rob(root->left->right);//跳过root->left
        if(root->right)val1 += rob(root->right->left) + rob(root->right->right);//跳过root->right
        //不偷父节点
        int val2 = rob(root->left) + rob(root->right);
        umap[root] = max(val1,val2);
        return max(val1, val2);
    }
};

动态规划:树形dp的入门题目

1.确定递归函数的参数和返回值

这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。

参数为当前节点,代码如下:

vector<int> robTree(TreeNode* cur) {

这里的返回数组就是dp数组

dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。

2. 确定终止条件

在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回

if (cur == NULL) return vector<int>{0, 0};相当于dp数组初始化

3. 确定遍历顺序

后序遍历

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

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

// 下标0:不偷,下标1:偷
vector<int> left = robTree(cur->left); // 左
vector<int> right = robTree(cur->right); // 右
// 中

4. 确定单层递归的逻辑

如果是偷当前节点,那么左右孩子就不能偷
如果不偷当前节点,那么左右孩子就可以偷
至于到底偷不偷一定是选一个最大的

5. 代码

/**
 * 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]);
    }
     长度为2的数组,0:不偷,1:偷
    vector<int> robTree(TreeNode* cur) {
        if(cur == nullptr) return vector<int>{0, 0};
        vector<int> left = robTree(cur->left);
        vector<int> right = robTree(cur->right);
        //偷cur,不能偷左右节点
        int val1 = cur->val + left[0] + right[0];
        //不偷,可以偷也可以不偷左右节点,取较大的情况
        int val2 = max(left[0], left[1])+ max(right[0], right[1]);
        return {val2,val1};//不能反
    }
};

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

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

相关文章

路径规划算法:基于热交换优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于热交换优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于热交换优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

HTTP编码杂谈

一 HTTP编码杂谈 ① 知识铺垫 1) 编码的英文叫encode --> 常见HTTP URL编码、Base64编码等目的&#xff1a; 转变为二进制的stream(字节流),便于网络传输备注&#xff1a; 一般都是基于utf-8编码2) 解码叫decode3) 乱码的根源&#xff1a; 编码和解码的方式不一致4) url…

深入理解深度学习——切面距离(Tangent Distance)、正切传播(Tangent Prop)和流形正切分类器

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 许多机器学习通过假设数据位于低维流形附近来克服维数灾难。一个利用流形假设的早期尝试是切面距离&#xff08;Tangent Distance&#xff09;算法 (Simard。它是一种非参数的最近邻算法&#xff0c;其中使用的度量不是…

libVLC 抓取视频帧并渲染(OpenGL)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在前面,我们写了几篇文章《libVLC 抓取视频帧并渲染(QWidget)》和《libVLC 抓取视频帧并渲染(QGraphicsView)》,分别介绍了QWidget 和 QGraphicsView 对视频帧的渲染,除了这些方式之外,还有一种最常…

动,静态库(与linux有关)

1.一些与本章标题无关的补充内容 当我们修改文件内容的时候&#xff0c;有可能会修改文件的属性。比如&#xff1a;可能会更改文件的大小属性。 我们在通过指令查看文件的时间相关属性时会往往观察到这样的现象&#xff1a;Access(访问时间&#xff0c;之前有具体讲过)没有及…

C++ string的简单应用

C语言的字符串 C的字符串 头文件&#xff1a; #include<string.h> //c #include<string> //C #include<cstring> //C 比较string的大小 两个string对象相加 使用字符串对象来存放字符串 两个string对象相加 string str "Hello,"; st…

求取平面参数

平面方程AXBYCZD0 变换一下-> A/DX B/DYC/DZ -1 该方程满足Axb 其中A为, x为,b为-1单位阵 求解代码如下: /* comment plane equation: Ax By Cz D 0 convert to: A/D*x B/D*y C/D*z -1 solve: A0*x0 b0 where A0_i [x_i, y_i, z_i], x0 [A/D, B/D, C/D]^T,…

逆向汇编与反汇编——基本数据类型

-1&#xff1a;0xFFFFFFFF 为什么内存使用补码来存储数据&#xff1f; 》因为CPU的设计只有加法器&#xff0c;没有减法&#xff0c;需要使用补码来实现减法 大端&#xff1a;数值的高位放到内存的低字节 小端模式验证&#xff1a;78 78 浮点型&#xff1a;单精度float和双精…

创建类构造器

类的创建 构造器 作用&#xff1a;给类赋值 类实际可分为&#xff1a;构造器属性方法 构造器的重载 重载&#xff1a;方法名相同&#xff0c;参数类型不同 一定要有空构造器&#xff01;&#xff01;&#xff01; TIP&#xff1a;this.指代当前创建对象

数据结构与算法系列之希尔排序

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选…

Python读写mat文件(使用scipy.io)

在matlab中&#xff0c;数据可保存为mat文件&#xff0c;使用save和load命令可进行读写操作。而在Python中&#xff0c;也可以对mat文件进行读写。 一、由matlab向Python传数据&#xff08;Python读取mat文件&#xff09; 第一步&#xff1a;使用matlab创建变量并保存至mat文…

某程序员——我应届毕业,年薪23万...

马士兵教育线下训练营第1期 已经圆满结束啦~ 不了解训练营的伙伴 有的在观望、有的在好奇 训练营真的能学到东西吗&#xff1f; 出去了之后能找到工作吗&#xff1f; 不如看看那些参加过的人是怎么说的 或许&#xff0c;你会对我们、对训练营 会有更深入的了解...... 0…

计算机视觉:转置卷积

转置卷积 文章目录 转置卷积基本操作填充、步幅和多通道性质 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是卷积神经网络&#xff08;CNN&#xff09;中的一种操作&#xff0c;它可以将…

排他网关-部署流程定义

类&#xff1a;com.roy.ActivitiGatewayExclusive /*** 部署流程定义*/Testpublic void testDeployment(){ // 1、创建ProcessEngineProcessEngine processEngine ProcessEngines.getDefaultProcessEngine(); // 2、得到RepositoryService实例RepositoryService…

剑指offer刷题笔记--题目11-20

1-旋转数组的最小数字&#xff08;11&#xff09; 主要思路&#xff1a; 一次旋转将最后一个元素移动最前面&#xff0c;由于数组最开始是升序的&#xff0c;因此数组的大部分元素都应该保持升序的状态&#xff08;n1<n2<...<n3>n4<n5<...<n6&#xff09;…

JAVA练习小游戏——贪吃蛇小游戏 PLUS版

目录 基础版本 新增内容 1.添加START开始界面 2.新增背景音乐 3.添加SCORE计分 4.新增游戏机制 代码实现 实机演示 基础版本 JAVA练习小游戏——贪吃蛇小游戏_timberman666的博客-CSDN博客https://blog.csdn.net/timberman666/article/details/131046742?spm1001.201…

xshell使用技巧小节

文章目录 1. 输出日志文件2. 快捷键设置3. 使用ctrlv按键4. 快速命令 1. 输出日志文件 需求&#xff1a;我们使用xshell时会经常需要把xshell中的内容打印到文件中&#xff0c;或者因为内容过多&#xff0c;xshell界面无法显示先显示出的内容&#xff0c;或者需要明确记录文件…

AlterNET Studio v9.0 Crack

AlterNET Studio v9.0 改进了代码编辑器、表单设计器和 Python LSP 解析器。 2023 年 6 月 5 日 - 11:22新版本 特征 代码编辑器 编辑器中添加了 Microsoft Visual Studio 主题。现在包括一个放大镜区域&#xff0c;可以更轻松地浏览文档的内容。带有 alpha 通道的图像现在用于…

汽车电子AUTOSAR之EcuM模块

目录 前言 正文 EcuM模块总体介绍 主要功能 总状态机&#xff08;Flexible 与 Fixed&#xff09; Startup Sequence STARTUP I STARTUP II RUN Sequence RUN II RUN III ShutDown Sequence ShutDown Target Go Sleep Go OFF I Go OFF II Sleep Sequence Sleep…

如何从平面图或蓝图为 ROS 创建地图

如何从平面图或蓝图为 ROS 创建地图 在本教程中&#xff0c;我将向您展示如何从平面图或蓝图为 RViz&#xff08;ROS 的 3D 可视化程序&#xff09;创建地图。为 RViz 创建地图是使机器人能够在环境中自主导航的重要步骤。 我们经常使用机器人的激光雷达来构建地图。这很好&am…