题目
分析
状态转移方程:dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
初始状态: dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);
代码
class Solution {
public int rob(int[] nums) {
int len=nums.length;
if(len==0)
return 0;
if(len==1)
return nums[0];
if(len==2)
return Math.max(nums[0],nums[1]);
//int[] dp=new int[len];
//dp[0]=nums[0];
//dp[1]=Math.max(nums[0],nums[1]);
//空间优化:用变量,省去dp数组的空间
int a=nums[0];
int b=Math.max(nums[0],nums[1]);
int max=0;
int c=0;
for(int i=2;i<len;i++){
//dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
//max=Math.max(max,dp[i]);
c=Math.max(a+nums[i],b);
max=Math.max(max,c);
a=b;
b=c;
}
return max;
}
}
复杂度
时间复杂度O(N),N是数组长度
空间复杂度O(1)