213. House Robber II
一、题目
1、审题
2、分析
一个连续的数组,你能获取不连续的元素值代表的财富,数组首尾的两个元素算作连续,求能获得的最大财富值。
二、解答
1、思路:
在 198. House Robber 的基础上添加了首尾不能连续的条件。
故,可以采用破坏圈的方法,即获取的元素范围为 [0, len - 2] 或者 [1, len -1],求这两个的最大值即可。
1 public int rob(int[] nums) { 2 int len = nums.length; 3 if(len == 1) 4 return nums[0]; 5 return Math.max(helper(nums, 0, len - 2), helper(nums, 1, len - 1)); 6 } 7 public int helper(int[] nums, int start, int end) { 8 int curYes = 0; // 当前的获取 9 int curNo = 0; // 当前的不获取 10 for (int i = start; i <= end; i++) { 11 int preNo = curNo, preYes = curYes; 12 curNo = Math.max(preNo, preYes); 13 curYes = preNo + nums[i]; 14 } 15 return Math.max(curNo, curYes); 16 }