代码随想录day50|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
最佳答案 问答题库718位专家为你答疑解惑
198.打家劫舍 (中等)
leetcode题目链接:198. 打家劫舍 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍_哔哩哔哩_bilibili
题目描述
解题思路
对于第i家,有两种情况 :1.偷第i家。2.不偷第i家。那么偷不偷第二家其实和前两家有关。
如果偷了第i-2家,那么第i家就可以偷,如果偷了第i-1家,那么第i家就不能偷。
那么我们可以用动态规划的思路来解决这个问题。
1.dp数组及下标含义
dp[i]表示到第i家时,偷窃到的最大金额dp[i]。
2.递推公式
如果偷第i-2家,那dp[i] = dp[i-2] + nums[i]
如果偷第i-1家,那么dp[i] = dp[i-1]
故dp[i] = max(dp[i-1] , dp[i-2]+nums[i])
3.初始化
dp[0] = 0。
dp[1] = max (nums[0],nums[1])。
4.遍历顺序
从前往后偷。
题目代码
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题目链接:213. 打家劫舍 II - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划,房间连成环了那还偷不偷呢?| LeetCode:213.打家劫舍II_哔哩哔哩_bilibili
题目描述
解题思路
本题和上一题不同的情况就在于首位两个元素选不选的情况。
那么我们可以分成三种情况:
1.首位元素都不考虑,只考虑中间元素。
2.首元素考虑,尾元素不考虑。
3.首元素不考虑,尾元素考虑。
上面三种情况也就成了打家劫舍1的题,而对于情况1,在2和3中以及包含。故返回一个2 ,3最大值即可。
题目代码
class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 0)return 0;if (nums.size() == 1)return nums[0];int case1 = robb(nums, 0, nums.size() - 2);int case2 = robb(nums,1,nums.size()-1);return max(case1, case2);}
private:int robb(vector<int>& n_nums,int begin,int end) {if (end == begin) return n_nums[begin];vector<int>nums(n_nums.begin()+begin, n_nums.begin()+end+1);vector<int> dp(nums.size());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];}
};
337.打家劫舍 III(中等)
题目代码
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 { 0,0 };vector<int>left = robTree(cur->left);vector<int>right = robTree(cur->right);//偷curint val1 = cur->val + left[0] + right[0];//不偷curint val2 = max(left[0], left[1]) + max(right[0], right[1]);return { val2,val1 };}
};
99%的人还看了
相似问题
- 每日一练:“打家劫舍”(House Robber)问题 III
- [动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍
- 代码随想录 Day40 动态规划08 LeetCodeT198打家劫舍 T213打家劫舍II T337 打家劫舍III
- 【算法练习Day40】打家劫舍打家劫舍 II打家劫舍 III
- leetcode做题笔记213. 打家劫舍 II
- leetCode 213. 打家劫舍 II + 动态规划 + 从记忆化搜索到递推 + 空间优化
- 【C++代码】背包问题,完全背包,多重背包,打家劫舍,动态规划--代码随想录
- 代码随想录day50|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
- Day40 力扣动态规划 :198.打家劫舍 |213.打家劫舍II | 337.打家劫舍III
- 【c++】打家劫舍(动态规划)
猜你感兴趣
版权申明
本文"代码随想录day50|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III":http://eshow365.cn/6-28969-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!