代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

当前房屋偷与不偷取决于前一个房屋是否被偷了

动规五部曲

  1. 确定dp数组及其下标含义:考虑下标i(包括i)以内的房屋,最多可以偷的金额为dp[i]
  2. 确定递归公式:如果前一个屋子被抢了,那么现在这间屋子不能抢,即dp[i] = dp[i-1];如果前一间屋子没被抢,那么这件屋子可以抢,即dp[i] = dp[i - 2] + nums[i];取较大值,dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
  3. dp数组的初始化:递推公式的基础为dp[0]和dp[1],从定义中可以得到dp[0] = nums[0],dp[1] = max(nums[0], nums[1]);
  4. 确定遍历顺序:dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,从前到后遍历
  5. 举例推导dp数组:以[2,7,9,3,1]为例,如图

代码:

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(), 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-2]+nums[i], dp[i-1]);}return dp[nums.size()-1];}
};

213.打家劫舍II

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

分成两种情况,一种是不包含头元素,一种是不包含尾元素,取较大值即可。

求解思路与上一题一样。

代码:

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

337.打家劫舍III

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

使用一个长度为2的数组,记录当前节点偷和不偷所得到的最大金钱

递归+动规

  1. 确定递归函数的参数和返回值:参数为当前节点,返回值为一个长度为2的数组;其中数组下标为0记录不偷该节点所得到的最大金钱,下标为1记录偷该节点所得到的最大金钱
  2. 确定终止条件:遇到空间点,无论偷还是不偷都是0,返回
  3. 确定遍历顺序:后序遍历二叉树,因为要通过递归函数的返回值来做下一步计算
  4. 确定单层递归逻辑:如果偷当前节点,则左右孩子都不能投,此时val1 = cur->val + left[0] + right[0];如果不偷当前节点,则左右孩子可偷可不偷,取较大的值,此时val2 = max(left[0], left[1]) + max(right[0], right[1]);注意最后返回{val2, val1},即{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}
  5. 举例推导dp数组:以示例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: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 == NULL) 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];// 不偷cur,则左右孩子可偷可不偷,取较大值int val2 = max(left[0], left[1]) + max(right[0], right[1]);// 注意这里的返回顺序不可以错return {val2, val1};}
};

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

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

相关文章

Qt串口助手

QT5 串口助手 ​ 由于C课程作业的需要&#xff0c;用QT5写了个简陋的串口助手。只作为一个简单的案例以供参考&#xff0c;默认读者具有C基础和了解简单的Qt操作。 功能展示 【用QT写了个简单的串口助手】 准备工作 Qt自带有<QSerialPort> 库, 可以方便地配置和调用…

lv11 嵌入式开发 轮询与中断13

1 CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始 中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c;CPU接收到中…

常见预处理

预处理 ——# 预处理功能&#xff1a;宏定义、文件包含、条件编译。 预处理命令 #include&#xff08;文件包含命令&#xff09; #define&#xff08;宏定义命令&#xff09; #undef #if&#xff08;条件编译&#xff09; #ifdef #ifndef #elif #endif defined函数&#xff0…

python爬取robomaster论坛数据,作为后端数据

一. 内容简介 python爬取robomaster论坛数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析 # 接口分析 # 全部数据 # https://bbs.robomaster.com/forum.php?modforumdisplay&fid63 2…

LeetCode343. Integer Break

文章目录 一、题目二、题解 一、题目 Given an integer n, break it into the sum of k positive integers, where k > 2, and maximize the product of those integers. Return the maximum product you can get. Example 1: Input: n 2 Output: 1 Explanation: 2 1 …

Ubuntu systemd-analyze命令(系统启动性能分析工具:分析系统启动时间,找出可能导致启动缓慢的原因)

文章目录 Ubuntu systemd-analyze命令剖析目录简介systemd与systemd-analyze工作原理 安装和使用命令参数详解用例与示例显示启动时间&#xff08;systemd-analyze time&#xff09;列出启动过程中各个服务的启动时间&#xff08;systemd-analyze blame&#xff09;显示系统启动…

Linux中office环境LibreOffice_7.6.2下载

阿里云盘&#xff1a;LibreOffice_7.6.2 使用&#xff1a;下载的文件为exe文件&#xff0c;双击exe文件即可获取到文件 LibreOffice_7.6.2安装&#xff1a; 解压&#xff1a;tar -zxvf LibreOffice_7.6.2_Linux_x86-64_rpm.tar.gz 移动到RPMS目录&#xff1a;cd LibreOffice_7…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一&#xff0c;其旨在有选择地提取图像的某些特征&#xff0c;可以用于在给定应用程序的上下文中传达重要信息&#xff0c;例如&#xff0c;去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

QT之QNetworkAccessManager

文章目录 成员函数例程 成员函数 1&#xff09;QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data) 该函数用于发送 HTTP POST 请求&#xff0c;将数据作为请求体发送。 2&#xff09;QNetworkReply *put(const QNetworkRequest &req…

厦门城市建设与建筑结构健康监测系统的重要性与作用

厦门&#xff0c;这座美丽的海滨城市&#xff0c;随着经济的快速发展和城市化的不断推进&#xff0c;城市建设已成为人们关注的焦点。其中&#xff0c;建筑结构健康监测系统对于保障城市建设和建筑的安全具有举足轻重的地位。 WITBEE万宾针对建筑的动态平衡&#xff0c;温湿度&…

shell编程系列(7)-使用wc进行文本统计

文章目录 前言wc命令的使用wc命令的参数说明&#xff1a;统计字数统计行数打印文本行号 结语 前言 统计功能也是我们在shell编程中经常碰到的一个需求&#xff0c;wc命令可以适用于任何需要统计的数据&#xff0c;不只是统计文本&#xff0c;配合ls命令我们可以统计文件的个数…

java gc垃圾回收机制(垃圾收集 Garbage Collection)

一文带你深入JAVA GC&#xff08;垃圾回收机制&#xff09;面试讲解&#xff01;&#xff01;&#xff01; - 知乎 gc常用算法 gc常用算法有&#xff1a;标记-清除算法&#xff0c;标记-压缩算法&#xff0c;复制算法&#xff0c;分代收集算法。 复制算法&#xff08;Java中…

java--子类构造器的特点

1.子类构造器的特点 子类的全部构造器&#xff0c;都会先调用父类的构造器&#xff0c;再执行自己。 2.子类构造器是如何实现调用父类构造器的 ①默认情况下&#xff0c;子类全部构造器的第一行代码都是super()(写不写都有)&#xff0c;它会调用父类的无参数构造器。 ②如果…

【攻防世界-misc】来自银河的信号

1.下载并打开文件&#xff0c;是个音频软件 2.由于打开音频出现的声音类似于无线波&#xff0c;因此需要用RX-SSTV工具打开&#xff0c; RX-SSTV代表“接收图像慢扫描电视”的意思。慢扫描电视是一种通过无线电进行图像传输的技术&#xff0c;通常用于业余无线电领域。RX-SST…

分治法之归并排序

思路: 将待排序数组分成两个子数组&#xff0c;计算中间位置mid。对左半部分进行递归排序&#xff0c;得到一个有序的子数组。对右半部分进行递归排序&#xff0c;得到另一个有序的子数组。合并两个有序的子数组&#xff0c;得到一个完整的有序数组。 示例图: 代码: #include&…

JAVA 算法面试总结

1、二分查找 二分查找又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置 的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c; 则在后半部分循环…

【ONE·Linux || 网络基础(四)】

总言 主要内容&#xff1a;传输层UDP、TCP协议基本介绍。UDP报文格式、TCP报文格式、三次握手四次挥手、TCP可靠性策略说明。 文章目录 总言8、UDP协议&#xff08;传输层一&#xff09;8.1、传输层预备知识8.1.1、端口号8.1.2、一些指令&#xff08;netstat、pidof、xargs&am…

linux 内核工作队列

工作队列&#xff08; work queue&#xff09;是使用内核线程异步执行函数的通用机制。 工作队列是中断处理程序的一种下半部机制&#xff0c;中断处理程序可以把耗时比较长并且可能睡眠的函数交给工作队列执行。 工作队列不完全是中断处理程序的下半部。内核的很多模块需要异步…

android NDK相关,调用C库,JNI,交叉编译,跨平台

首先就是库给我&#xff0c;我先进行开发&#xff08;按照文档&#xff09;&#xff0c;最后进行交叉编译ARM平台。 遇到的问题&#xff1a;我要看到代码效果&#xff0c;所以必须要在真机上跑代码&#xff0c;那么我调用的库就必须是我这个平台适用的&#xff0c;有两种方式&…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…