198. 打家劫舍

Problem: 198. 打家劫舍

Reference

https://www.programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html

思路

dp数组含义: 打劫到第i间的最大收益

递推公式: dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);

如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i],即:第i-1房一定是不考虑的。

如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房。

初始化: dp[0] 一定是 nums[0]dp[1]就是nums[0]和nums[1]的最大值即: dp[1] = max(nums[0], nums[1]);

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());
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];
}
};