代码随想录算法打卡第四十一天, 新手自我记录一下刷题历程, 仅为自我打卡使用.
198. 打家劫舍
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 - 1], dp[i - 2] + nums[i]);
}
return dp[nums.size() - 1];
}
};
213. 打家劫舍 II
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() == 1) return nums[0];
if (nums.size() == 2) return max(nums[0], nums[1]);
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < nums.size() - 1; ++i) {
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
int result = dp[nums.size() - 2];
dp = vector<int> (nums.size(), 0);
dp[1] = nums[1];
dp[2] = max(nums[1], nums[2]);
for (int i = 3; i < nums.size(); ++i) {
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
result = max(result, dp[nums.size() - 1]);
return result;
}
};
337. 打家劫舍 III
class Solution {
public:
vector<int> postOrderTraversal(TreeNode* root) {
if (root == nullptr) return {0, 0};
vector<int> leftDp = postOrderTraversal(root->left);
vector<int> rightDp = postOrderTraversal(root->right);
int val_0 = max(leftDp[0], leftDp[1]) + max(rightDp[0], rightDp[1]);
int val_1 = root->val + leftDp[0] + rightDp[0];
return {val_0, val_1};
}
int rob(TreeNode* root) {
vector<int> result = postOrderTraversal(root);
return max(result[0], result[1]);
}
};
希望还能再坚持一天!