打家劫舍 II
阿新 • • 發佈:2020-08-07
破環:
3種情況:
1、選頭不選尾
2、選尾不選頭
3、不選頭和尾
題目變化成打家劫舍1版本了,設定兩個dp,一個捨去頭一個捨去尾,之後比較兩者最大值即可。
class Solution { public int rob(int[] nums) { int n = nums.length; if (n == 0) return 0; if (n == 1) return nums[0]; if(nums.length == 2) return Math.max(nums[0],nums[1]); int[] dp1 = new int[n];//截止到第i家打劫的最大錢數 int[] dp2 = new int[n]; dp1[0] = nums[0]; dp1[1] = Math.max(nums[0], nums[1]); for (int i = 2; i < n-1; i++) {//去尾 dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]); } dp2[1] = nums[1]; dp2[2] = Math.max(nums[1], nums[2]); for (int i = 3; i < n; i++) {//去頭 dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]); } return Math.max(dp1[n-2],dp2[n-1]); } }