打家劫舍II
学习记录自代码随想录
要点:1.分情况,分别考虑带首元素和尾元素,然后返回两者中的较大值;
class Solution {
public:
int robRange(vector<int>& nums, int start, int end){
if(start == end) return nums[start];
int n = nums.size();
// 1.dp[i]代表i个屋子偷窃最大金额
vector<int> dp(n, 0);
// 2.递推公式:dp[i] = max(dp[i-1], dp[i-2] + nums[i])(i > 2)
// 3.初始化
dp[start] = nums[start];
dp[start+1] = max(nums[start], nums[start+1]);
// 4.遍历顺序:正向遍历
for(int i = start+2; i <= end; i++){
dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
}
// 5.举例推导dp数组
return dp[end];
}
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 1) return nums[0];
if(n == 2) return max(nums[0], nums[1]);
// if(n == 3) return max(nums);
// 考虑首元素, 不考虑尾元素
int result_1 = robRange(nums, 0, n-2);
// 考虑尾元素,不考虑首元素
int result_2 = robRange(nums, 1, n-1);
return max(result_1, result_2);
}
};