leetcode213. 打家劫舍 II

题目: 在 198打家劫舍1 的题目基础上,规定所有房屋连成一个圈(首尾连接)

首先,首尾房间不能同时被抢,那么只可能有三种不同情况:

  1. 要么都不被抢;
  2. 要么第一间房子被抢最后一间不抢;
  3. 要么最后一间房子被抢第一间不抢。

所以整个问题变成:这三种情况,那种的结果最大 ? 最大的就是最终答案!不过,其实不需要比较三种情况,只要比较情况二和情况三就行了,因为第一种情况两个屋子都不抢:隐含的意思就是相当于没有两个屋子,可选择的屋子情况明显被后两种情况包含了。

注意的是:有可能两个屋子就是都没有抢,比如:1,4,0,4,1。但是没有被抢和不提供选择是两码事。robCore(nums, start, end) 是在[start,end]两者之间选择。
所以只要return :

max(robCore(nums, 0, nums.size() - 2),
    robCore(nums, 1, nums.size() - 1));

把打家劫舍1的解法改成在区间内工作就可以了

     public int rob(int[] nums) {
        int len = nums.length;
        if (len == 0) return 0;
        if (len == 1) return nums[0];
        return Math.max(rob_198(nums, 0, len - 2), rob_198(nums, 1, len - 1));
     }
    // 198题的代码 换成区间内有效就行了
    int rob_198(int[] nums, int start, int end) { 
        if (end == start) return nums[start];
        int dpLast = nums[start], dpPre = Math.max(nums[start], nums[start + 1]);

        for (int i = start + 2; i <= end; ++i) {
            int tmp = dpPre;
            dpPre = Math.max(dpPre, dpLast + nums[i]);
            dpLast = tmp;
        }
        return dpPre;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值