链接点我
注:和【198】打家劫舍是一模一样的重复题。
题目描述
思路
1.空间O(n)
这题是【打家劫舍】的变种。
状态转移方程: dp[i] = max(dp[i-1] + dp[i-2] + nums[i])
dp[i]
表示在 i 这个位置的最长时长
public int massage(int[] nums) {
if(nums == null || nums.length == 0){
return 0;
}
if(nums.length == 1){
return nums[0];
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i = 2; i < nums.length; i++){
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[nums.length-1];
}
2.空间O(1)
由于dp[i]
的值只与 dp[i-2]
和 dp[i-1]
有关,并且得知dp[i]
的值后就不需要dp[i-2]
的值了。
可以只用两个变量来求解。
public int massage(int[] nums) {
int a = 0,b = 0;
for(int i = 0; i < nums.length;i++){
int c = Math.max(a+nums[i] ,b);
a = b;
b = c;
}
return b;
}