欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode213. 打家劫舍 II

程序员文章站 2022-07-12 08:51:21
...

题目: 在 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;
    }