题目:
代码(首刷自解):
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==1) return nums[0];
else if(n==2) return max(nums[0],nums[1]);
// 1.dp数组下标:到i所能得的最大金额
vector<int> dp(n);
// 2.初始化第0家和第1家偷的金额
dp[0]=nums[0],dp[1]=max(nums[0],nums[1]);
// 3.递推方向:左→右
for(int i = 2;i < n; ++i){
// 4.递推公式
dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
}
return max(dp[n-2],dp[n-1]);
}
};
代码(二刷自解 2024年2月29日 耗时:6:00):
class Solution {
public:
// 动态规划
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
if (n == 2) return max(nums[0], nums[1]);
// dp 初始化
vector<int> dp(n , 0);
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];
// 递推公式:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
}
};
代码(三刷自解 2024年3月10日 3min)
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() == 1) return nums[0];
// dp 表示到 i 时最大偷盗金额
vector<int> dp(nums.size(), 0);
// 初始化 0 1
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
// 递推公式: dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
for (int i = 2; i < nums.size(); ++i) {
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[nums.size() - 1];
}
};