Day48 | 198. 打家劫舍 | 213.打家劫舍Il |337. 打家劫舍 III
198. 打家劫舍
注意点:
1. 递推公式,dp[j-2]+nums[j]表示的是加上nums[j]后dp[j]的值, dp[j-1]表示的是不加nums[j]后dp[j-1]的最大值
class Solution {
public:int rob(vector<int>& nums) {vector<int> dp(nums.size(), 0);// 需要判断容器的大小,如果是0或者1的话需要排除一下if(nums.size() == 0) return 0;if(nums.size() == 1) return nums[0];// 对数组进行初始化dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);for(int j = 2; j < nums.size(); j++) {// 递推公式,dp[j-2]+nums[j]表示的是加上nums[j]后dp[j]的值, dp[j-1]表示的是不加nums[j]后dp[j-1]的最大值dp[j] = max(dp[j-2]+nums[j], dp[j-1]);}return dp[nums.size()-1];}
};
213. 打家劫舍 II
注意点:
1.当截得的区间为大小为1的时候,需要判断一下,如果begin+1 == end,就不用判断了,直接返回即可
class Solution {
public:
// 第一个和最后一个挨着的话意思是:如果偷了第一家就不能偷第二家了int rob(vector<int>& nums) {if(nums.size() == 0) return 0;if(nums.size() == 1) return nums[0];// 采用的是[begin,end)int resultLeft = robRang(nums, 0, nums.size()-1);int resultRight = robRang(nums, 1, nums.size());return max(resultLeft, resultRight);}int robRang(vector<int>& nums, int begin, int end) {vector<int> dp(nums.size());// 注意判断区间为1的时候,直接返回nums[begin]的值if(begin+1 == end) return nums[begin];dp[begin] = nums[begin];dp[begin+1] = max(nums[begin], nums[begin+1]);// [begin,end)for(int j = begin + 2; j < end; j++) {dp[j] = max(dp[j-2]+nums[j], dp[j-1]); }cout << dp[0] << dp[1] <<endl;return dp[end-1];}
};
337. 打家劫舍 III
注意点:
1.注意初始化的时候,dp[0]是不偷,dp[1]是偷,在最后val1是偷当前节点,val2是不偷当前节点的,所以dp[0]=val1,dp[1] = val2
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) {// dp[0]表示不偷,dp[1]表示偷vector<int> dp = robTree(root);return max(dp[0], dp[1]);}// 对树采取后序遍历的方式进行//递归三部曲
// 1. 确定递归函数的参数和返回值vector<int> robTree(TreeNode* root) {// 2. 确定终止条件if(root == nullptr) return vector<int>{0, 0};// 3. 确定遍历顺序 左右后vector<int> left = robTree(root->left);vector<int> right = robTree(root->right); // val1是偷当前节点,val2是不偷当前节点的,所以dp[0]=val1,dp[1] = val2int val1 = root->val + left[0] +right[0];int val2 = max(left[0], left[1]) + max(right[0] ,right[1]);return {val2, val1}; }};
Day48 | 198. 打家劫舍 | 213.打家劫舍Il |337. 打家劫舍 III相关推荐
- 代码随想录Day48|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
文章目录 198.打0家劫舍 213.打家劫舍II 337.打家劫舍III 198.打0家劫舍 文章讲解:代码随想录 (programmercarl.com) 题目链接:198. 打家劫舍 - 力扣( ...
- day40|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 ...
- 337.打家劫舍 III 121. 买卖股票的最佳时机
337.打家劫舍 III 树形dp,采用后序遍历,用dp[0],dp[1] 分别表示不取当前物品,和取当前物品的所获最大利润 /*** Definition for a binary tree nod ...
- leetcode 337. House Robber III | 337. 打家劫舍 III(树形dp;什么情况下dp需要强制包含当前元素?)
题目 https://leetcode.com/problems/house-robber-iii/ 思考:什么情况下 dp 需要强制包含当前元素? dp 过程中,需要包含当前元素 的例子: leet ...
- LeetCode 337. 打家劫舍 III(记忆化+递归)
文章目录 1. 题目 1.1 相关题目: 2. 解题 2.1 递归 2.2 记忆化递归 1. 题目 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称 ...
- 104. Leetcode 337. 打家劫舍 III (动态规划-打家劫舍)
步骤一.确定递归函数的参数和返回值: dp数组及下标的含义 dp数组的长度为2, 下标为0记录不偷该节点所得到的的最大金钱,下标为1记 录偷该节点所得到的的最大金钱. 步骤二.确定终止条件: 在遍历的 ...
- [leetcode] 337.打家劫舍3
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个" ...
- 【LeetCode笔记】337. 打家劫舍III(Java、树型动态规划)
文章目录 题目描述 思路 & 代码 更新版 题目描述 这年头当个小偷,都得会 dp 和二叉树了 和前面的 I & II 有点不同,这次直接换了数据结构,写树来了.(之后不会是图吧) 很 ...
- leetcode —— 337. 打家劫舍 III
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个" ...
最新文章
- 2020 年 4 月全国程序员工资新鲜出炉,我拖后腿了!
- 国际旅游管理专业跨专业考计算机,旅游管理考研我想跨专业考旅游管理专业的研究 – 手机爱问...
- 【转】C# HMAC Sha1 生成签字
- Qt3转Qt5(Ui部分)
- 安装 mysql 数据库_小水谈Mysql数据库---Mysql安装
- Andrew Ng 如何重拾梦想
- 围棋三番棋,得第二局得胜
- UI app界面的尺寸规范
- 3656. 心与心的距离
- Android云手机平台搭建-2020圈钱热潮
- mac系统学python_升级mac自带的python,学python拿mac还是win,使用系统自带Pyth
- DSS部署-12、DSS安装
- 数据库的主要设计步骤
- webpack之工欲善其事,必先利其器
- Kafka是如何实现高性能的?
- AxureRP9 中继器的简单使用
- 【Cadence生成网表失败排查思路】
- 论文中常用的反证法思路本质理解
- ruby中uniq和uniq!的区别
- C语言学习第017课——C语言提高(一)