30 Day Challenge Day 12 | Leetcode 198. House Robber
题解
动态规划
Easy
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty()) return 0;
if(nums.size() == 1) return nums[0];
if(nums.size() == 2) return max(nums[0], nums[1]);
int n = nums.size();
// dp1[i]: maximum amount of money for i houses
vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i = 2; i < n; i++) {
dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
}
return dp[n-1];
}
};
空间优化
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty()) return 0;
int n = nums.size();
int prev = 0, curr = nums[0];
for(int i = 1; i < n; i++) {
int temp = curr;
curr = max(prev + nums[i], curr);
prev = temp;
}
return curr;
}
};