简介
题目链接:https://leetcode.cn/problems/house-robber/description/
解决方式:数组 + 动态规划
这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!
推荐看 nettee 大佬的讲解。
动态规划
经典
解题思路:重要的是状态的定义(前 k 个房间最大金额)和状态转移方程式(k - 1 房间偷还是不偷)。
java
class Solution {
public int rob(int[] nums) {
// 边界处理
if(nums.length == 0){
return 0;
}
// 状态的定义
int n = nums.length;
int[] dp = new int[n + 1];
// 初始值
dp[0] = 0;
dp[1] = nums[0];
// 状态转移方程式(递推)
for(int i = 2; i <= n; i++){
dp[i] = Math.max(dp[i - 1], nums[i - 1] + dp[i - 2]);
}
// 返回结果
return dp[n];
}
}
空间优化
java
public int rob(int[] nums) {
int prev = 0;
int curr = 0;
// 每次循环,计算"偷到当前房子为止的最大金额"
for (int i : nums) {
// 循环开始时,curr 表示 dp[k-1],prev 表示 dp[k-2]
// dp[k] = max{ dp[k-1], dp[k-2] + i }
int temp = Math.max(curr, prev + i);
prev = curr;
curr = temp;
// 循环结束时,curr 表示 dp[k],prev 表示 dp[k-1]
}
return curr;
}