Leetcode198:打家劫舍(动态规划、滚动数组)
来源
方法1:动态规划
money[i] 表示有i个房子,偷的钱最多
money[i]= max{money[i-1], nums[i]+money[i-2]}
1 class Solution { 2 public int rob(int[] nums) { 3 int n = nums.length; 4 int[] money = new int[n]; 5 if(n==1) { 6 return nums[0]; 7 } 8 if(n==2){ 9 return Math.max(nums[0],nums[1]); 10 } 11 money[0] = nums[0]; 12 money[1] = Math.max(nums[0],nums[1]); 13 14 for(int i = 2; i){ 15 money[i] = Math.max(money[i-1],money[i-2]+nums[i]); 16 } 17 return money[n-1]; 18 } 19 }
方法2:滚动数组(继动态规划的优化)
money[i]= max{money[i-1], nums[i]+money[i-2]}
由于money[i]只与前两项有关,所以可以用滚动数组动态维护前两项
1 class Solution { 2 public int rob(int[] nums) { 3 int n = nums.length; 4 if(n==1) { 5 return nums[0]; 6 } 7 if(n==2){ 8 return Math.max(nums[0],nums[1]); 9 } 10 int pre_pre = nums[0];//money[i-2] 11 int pre= Math.max(nums[0],nums[1]);//money[i-1] 12 int tmp = 0; 13 for(int i = 2; i){ 14 tmp = pre; 15 pre = Math.max(pre, pre_pre+nums[i]); 16 pre_pre = tmp; 17 } 18 return pre; 19 } 20 }