Leetcode213. House Robber II

相对于House Robber I多了个首尾相连的限制,其实也就是多了一个“抢房间0就不能抢房间n-1”的约束。而这个约束限制我们不能用老的转移方程来计算dp数组。

那么怎么打破这个约束呢?

其实就是高考21题的分类思想:

分成我们抢房间0(不抢房间n-1)和不抢房间0(可以抢房间n-1)两种,分别求dp再取最大值,时间复杂度不变。

class Solution {
    public int rob(int[] nums) {
        if(nums==null||nums.length<1) return 0;
        if(nums.length==1) return nums[0];
        return Math.max(subRob(nums,0,nums.length-2),subRob(nums,1,nums.length-1));
    }
    private int subRob(int[] nums,int start,int end){
        int length = end-start+1;
        if(length==1) return nums[start];
        int[] dp = new int[nums.length];//避免后面数组出界
        dp[start] = nums[start];
        dp[start+1] = nums[start+1];
        int max = Math.max(dp[start],dp[start+1]);
        if(length==2) return max;
        dp[start+2] = dp[start]+nums[start+2];
        max = Math.max(max,dp[start+2]);
        for(int i=3;i<length;i++){
            dp[i+start] = Math.max(dp[start+i-2],dp[start+i-3])+nums[start+i];
            if(dp[start+i]>max) max = dp[i+start];
        }
        return max;
    }
}
Runtime: 2 ms, faster than 100.00% of Java online submissions for House Robber II.
Memory Usage: 36.8 MB, less than 52.99% of Java online submissions forHouse Robber II.
posted @ 2019-03-11 15:37  大胖子球花  阅读(84)  评论(0)    收藏  举报