本文共 1026 字,大约阅读时间需要 3 分钟。
思路:
因为这里面不可能同时抢第一个房间和最后一个房间。所以,我们可以把问题拆成两个。回归到House Robber I 问题一 第一个到倒数第二个房间采用House Robber I算法 问题二 第二个到最后一个房间采用House Robber I算法 比较大小后返回。。之所以能够分成这两个问题的原因是
第一个和最后一个房间可以分成如下四种情况 1第一个和这后一个都抢 这不符合题意。问题一,二都不可能得着最优解是同时抢第一个和最后一个的出来的。 2只抢第一个 如果抢第一个,那么一定不能抢最后一个。 在问题一中,如果真的抢第一个可以带来最优解那么问题一会找出来。 3只抢最后一个 如果抢最后一个,那么一定不会抢第一个。 在问题二中,如果真的抢最后一个可以带来最优解那么问题二会找出来。 4两个都不抢 包括在两个子问题中。因为这两个子问题的最优解都可能没抢第一个和最后一个public class Solution { public int rob(int[] nums) { if(nums.length==0) { return 0; } if(nums.length==1) { return nums[0]; } int resultA=robHelp(nums, 0, nums.length-2); int resultB=robHelp(nums, 1, nums.length-1); return Math.max(resultA, resultB); } public int robHelp(int[] nums,int start,int end) { int unRob=0; int doRob=0; for(int i=start;i<=end;i++) { int temp=unRob; unRob=Math.max(temp,doRob); doRob=temp+nums[i]; } return Math.max(unRob, doRob); }}
转载地址:http://fduvb.baihongyu.com/