思路:
动态规划dp
代码:
class Solution {
public int rob(int[] nums) {
int n=nums.length;
if(n==0) return 0;
if(n==1) return nums[0];
int[] dp=new int[n];
dp[0]=nums[0];
//注意不是dp[1]=nums[1],因为还有nums[0]
dp[1]=Math.max(dp[0],nums[1]);
for(int i=2;i<n;i++){
//若不选i,则选dp[i-1]
//若选i,则选dp[i-2]+nums[i]
//比较两者哪个更大
dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[n-1];
}
}
分解:
1)只能选隔空的,则最大值就是当前值+dp[i-2]或dp[i-1]
dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
2)注意初始化,不是dp[1]=nums[1],因为还有nums[0]
dp[1]=Math.max(dp[0],nums[1]);
复杂度分析:
时间复杂度:O(N)
空间复杂度:O(N)