leetCode House Robber II

题目链接

思路:
因为这里面不可能同时抢第一个房间和最后一个房间。所以,我们可以把问题拆成两个。回归到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);
    }
}

你可能感兴趣的:(leetCode House Robber II)