LeetCode-213. 打家劫舍 II

LeetCode-213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:

输入: [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

思路

此题与打家劫舍一有所不同的是,数组是环形数组(用首尾相同的元素去实现的)。所以我们可以分情况讨论。

如果打劫第一家,那么就不能打劫最后一家。

如果打劫最后一家,就不能打劫第一家。

这两个集合取并集就是所有的情况。

这两个集合中打劫钱数最多的情况就是所求答案。

class Solution {
     
    public int rob(int[] nums) {
     
        
        if(nums==null || nums.length==0)
        return 0;

        int n=nums.length;//环形街区的长度

        if(n==1)
        {
     
            return nums[0];
        } 
        //分情况讨论,再取最值
        return Math.max(rob(nums,0,n-2),rob(nums,1,n-1));
    }   
    private int rob(int[] nums,int begin,int end)
    {
     
        int pre1=0;
        int pre2=0;

        int cur=0;
        //这里的end是下标,注意边界
        for(int i=begin;i<=end;i++)
        {
     
            cur=Math.max(pre2+nums[i],pre1);

            pre2=pre1;
            pre1=cur;
        }
        return pre1;
    }
}

你可能感兴趣的:(数据结构与算法)