本题来自:力扣-每日一题
力扣 (LeetCode) 全球极客挚爱的技术成长平台https://leetcode.cn/
题解:
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if(len == 0)return 0;
if(len == 1)return nums[0];
int first = nums[0];
int second = Math.max(nums[0],nums[1]);
for(int i = 2;i < len;i++){
int temp = second;
second = Math.max(first + nums[i],second);
first = temp;
}
return second;
}
}
思路:
分治算法+动态规划+滚动数组
要计算能取到的最大金额,只需要将情况分为当天取和当天不取即可
举例:第三天能偷到的最大金额,
第三天偷:第一天能偷到的最大金额加上第三天偷到的金额
第三天不偷:第二天能偷到的最大金额
两者比较取最大,所以可以使用动态数组,temp用于交换
综上可得公式
dp[ i ]= max ( dp[ i − 2 ] + nums[ i ] , dp[ i − 1 ] )