本文主要是介绍代码随想录Day39:198.打家劫舍、213.打家劫舍II、337.打家劫舍III,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
198. 打家劫舍
题目链接:LeetCode198.打家劫舍
文档讲解:代码随想录LeetCode198.打家劫舍
题解
dp[i]偷或不偷,取决于dp[i-1]和dp[i-2]是否偷
class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 1)return nums[0];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 - 1], dp[i - 2] + nums[i]);}return dp[nums.size() - 1];}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
213. 打家劫舍II
题目链接:LeetCode213.打家劫舍II
文档讲解:代码随想录LeetCode213.打家劫舍II
题解
房屋变为环状,对于给定数组,分别去掉首位、末位,均可按照非环状情况处理,再取最大值即可
class Solution {
public: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 - 1], dp[i - 2] + nums[i]);}return dp[end];}int rob(vector<int>& nums) {if (nums.size() == 1) {return nums[0];}int value1 = robRange(nums, 0, nums.size() - 2);int value2 = robRange(nums, 1, nums.size() - 1);return max(value1, value2);}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
337. 打家劫舍III
题目链接:LeetCode337.打家劫舍III
文档讲解:代码随想录LeetCode337.打家劫舍III
题解
树形dp题目,房屋变为树状结构,需要采取迭代方法遍历,采用后序遍历,当前节点偷不偷取决于左右子节点偷不偷,记录每个节点偷和不偷的情况。
class Solution {
public: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);int value1 = max(left[0], left[1]) + max(right[0], right[1]);int value2 = cur->val + left[0] + right[0];return {value1, value2};}int rob(TreeNode* root) {vector<int> res = robTree(root);return max(res[0], res[1]);}
};
- 时间复杂度:O(n)
- 空间复杂度:O(logn)
这篇关于代码随想录Day39:198.打家劫舍、213.打家劫舍II、337.打家劫舍III的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!