题解 | #打家劫舍(二)#
打家劫舍(二)
https://www.nowcoder.com/practice/a5c127769dd74a63ada7bff37d9c5815
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int rob(vector<int>& nums) {
int length = nums.size();
if (length == 1) return nums[0];
vector<vector<int>> dp(length, vector<int>(2, 0));
// 情况1:第一家偷
dp[1][0] = nums[0], dp[1][1] = nums[0]; // 第二家不能偷
for (int i = 2; i < length - 1; i++) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
}
int ans1 = max(dp[length-2][0], dp[length-2][1]); // 倒数第二家
// 情况2:第一家不偷
dp[1][0] = 0, dp[1][1] = nums[1]; // 第二家可偷可不偷
for (int i = 2; i < length; i++) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
}
int ans2 = max(dp[length-1][0], dp[length-1][1]); // 倒数第一家
return max(ans1, ans2);
}
};

查看7道真题和解析