题目
给定一个数组,表示每间房屋的金币。你是一个盗贼,想要盗窃这里的金币。但如果盗窃两家相邻的房屋则会引起报警器报警。求问你可以盗窃的最大金币和为多少。
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
原题链接:https://leetcode.cn/problems/house-robber/
思路
动态规划。dp[i] 表示当前为止能获得的金额。dp[i] = max(dp[i-2] + nums[i], dp[i-1])。
初始化,dp[0] = nums[0]。dp[1] = max(nums[1], nums[0])
- 复杂度分析
- 时间复杂度 O(n)。
- 空间复杂度 O(1)。
代码
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]);
}
int dp0 = nums[0];
int dp1 = max(nums[0], nums[1]);
int dp2 = 0;
for (int i = 2; i < nums.size(); i++) {
dp2 = max(dp0 + nums[i], dp1);
dp0 = dp1;
dp1 = dp2;
}
return dp2;
}
};