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

server/2024/11/26 4:27:16/

目录

题目链接: 198.打家劫舍

思路

代码

题目链接: 213.打家劫舍II

思路

代码

题目链接: 337.打家劫舍III

思路

代码

总结


题目链接:198.打家劫舍

思路

        ①dp数组,考虑下标i所能偷取的最大金币数为dp[i]

        ②递推公式,dp[i] = max(dp[i-2] + nums[i], dp[i-1]),当前房间只有偷和不偷两个选择,如果上上个房间已经偷了,则当前房间必须偷才能满足最大;如果上一个房间已经偷过了,则当前房间一定不能偷。所以取这两种状态中的最大值进行dp数组更新

        ③dp数组初始化,dp[0] = nums[0],只有一个房间时一定要偷;dp[1] = max(nums[0], nums[1]),到第二个房间时,选择两个中金币最多的一个

        ④遍历顺序,由递推公式可知,后面的状态都由前面推导而来,所以遍历从前往后

        ⑤推导dp数组

代码

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

题目链接:213.打家劫舍II

思路

        与198.打家劫舍不同的是加入了环,考虑环有三种情况:不考虑首尾;不考虑尾;不考虑首。用上一题的思路,该题的后两种情况是包含第一种的。

代码

class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 1)return nums[0];// 不考虑尾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) {if (end == start)return nums[start];vector<int> dp(nums.size(), 0);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

思路

        本题将数据结构换成了二叉树,首先要确定二叉树的遍历顺序,因为需要用递归的返回值做进一步的计算,所以必须是后序遍历。递归三部曲:

        ①确定函数类型和参数,参数为树的根节点,函数类型为int型的数组

        ②确定终止条件,当遍历到空节点时向上返回

        ③单层递归逻辑,每个节点都有偷或者不偷两个选择,因此这里定义dp数组,长度为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:// 两个状态,0表示不偷,1表示偷vector<int> traversal(TreeNode* cur) {// 终止条件if (cur == NULL)return vector<int>{0, 0}; // 空节点时偷与不偷都是0// 后序遍历vector<int> left = traversal(cur->left);   // 左vector<int> right = traversal(cur->right); // 右// 中,单层递归逻辑// 不偷当前节点,就可以偷孩子节点,选择最大的int val0 = max(left[0], left[1]) + max(right[0], right[1]);// 偷当前节点,就不能偷孩子节点int val1 = cur->val + left[0] + right[0];return {val0, val1};}int rob(TreeNode* root) {vector<int> result = traversal(root);return max(result[0], result[1]);}
};

总结

        ①打家劫舍这种题的思路并不难,难点在于如何应用到不同的数据结构中

        ②数组的操作比较常规;环形数组分情况讨论,一开始不好想到

        ③二叉树中的动态规划,有两个关键点:一是二叉树结构数据的熟悉程度,主要是递归三部曲以及遍历顺序的选择;二是动态规划的熟练程度,主要是动规五部曲,与数组中的动态规划相比,dp数组的状态转移是逐层返回


http://www.ppmy.cn/server/38299.html

相关文章

某盾BLACKBOX逆向关键点

需要准备的东西&#xff1a; 1、原JS码 2、AST解混淆码 3、token(来源于JSON) 一、原JS码很好获取&#xff0c;每次页面刷新&#xff0c;混淆的代码都会变&#xff0c;这是正常&#xff0c;以下为部分代码 while (Qooo0) {switch (Qooo0) {case 110 14 - 55: {function O0…

node.js安装及环境配置超详细教程【Windows系统安装包方式】

Step1&#xff1a;下载安装包 https://nodejs.org/zh-cn/download/ 根据自己电脑系统及位数选择&#xff0c;我的电脑是Windows系统、64位、想下载稳定版的.msi&#xff08;LTS为长期稳定版&#xff09;这里选择windows64位.msi格式安装包。 .msi和.zip格式区别&#xff1a;…

【吃透Java手写】1- Spring(上)-启动-扫描-依赖注入-初始化-后置处理器

【吃透Java手写】Spring&#xff08;上&#xff09;启动-扫描-依赖注入-初始化-后置处理器 1 准备工作1.1 创建自己的Spring容器类1.2 创建自己的配置类 ComponentScan1.3 ComponentScan1.3.1 Retention1.3.2 Target 1.4 用户类UserService Component1.5 Component1.6 测试类 2…

git: 远程分支同步到本地

git pull origin <远程分支名> git pull可以将远程某一个分支下拉到本地并和本地的分支进行合并。如果不加origin <远程分支名>&#xff0c;那么这个同步就是将当前本地分支对应的远程分支给下拉合并进当前本地分支 git fetch --all 下载所有远程分支代码到本地…

鸿蒙组件样式复用简介

鸿蒙组件样式复用简介 使用Style进行复用在Component内部复用在Component外部复用使用Extend复用指定类型组件Extend支持参数传递 使用Style进行复用 在页面开发过程中&#xff0c;会遇到多个组件都在使用相同的样式&#xff0c;这时候就要考虑是不是可以将相同的样式的进行复…

【C语言】路漫漫其修远兮,深入[指针]正当下

一. 指针初步 1.概念定义 地址&#xff1a;我们在内存中开辟空间时&#xff0c;为了方便后续访问&#xff0c;每个数据有确切的地址。 指针&#xff1a;指向数据的地址&#xff0c;并将其地址储存在指针变量中。 2.基本运算符 • 取地址操作符&#xff08;&&#xff09; …

魔改IDEA,让你的IDEA 好看到爆炸!!!

超简单易学的style风格 在文章开篇&#xff0c;先show两张个人最喜欢的IDEA style 对我们程序员开发来说&#xff0c;IDEA 默认设置&#xff0c;虽然不丑&#xff0c;但就是太单调&#xff0c;千篇一律。 故而我在网上寻寻觅觅&#xff0c;终于在不断试错后&#xff0c;找到了…

【Linux】搭建私有yum仓库(类阿里云)

在搭建本地yum仓库并配置国内镜像阿里云源中了解yum源 yum &#xff1a; Yellow dog Updater&#xff0c;Modified&#xff0c;是一种基于rpm包的自动升级和软件包管理工具。yum能从指定的服务器自动下载rpm包并安装&#xff0c;自动计算出程序之间的依赖关系和软件安装的步骤&…