题目

image.png

思路

  • 总体思路与打家劫舍类似,只是要把环拆成两个队列,一个是从0到n-1,另一个是从1到n,然后返回两个结果最大的。或者记住它是否使用了第一个元素

    代码

    ```java //1.暴力递归 public int rob(int[] nums) {

    1. int len = nums.length;
    2. if (len == 0) return 0;
    3. return Math.max(recur(nums, len - 3, 1) + nums[len - 1], recur(nums, len - 2, 0));

    }

    public int recur(int[] nums , int i, int end) {

      if (i < end) return 0;
      return Math.max(recur(nums, i - 2, end) + nums[i], recur(nums, i - 1, end));
    

    }

    //2.动态规划 public int rob(int[] nums) {

      int len = nums.length;
      if (len == 0) return 0;
      if (len == 1) return nums[0];
      int p1 = nums[0], p2 = Math.max(nums[0], nums[1]);
      int p3 = 0, p4 = 0, t = 0;
      for (int i = 2; i < len; i++) {
          if (i < len - 1) {
              t = Math.max(p1 + nums[i], p2);
              p1 = p2;
              p2 = t;
          }
          if (i == 3) {
              p3 = nums[1];
              p4 = Math.max(nums[1], nums[2]);
          }
          if (i > 2) {
              t = Math.max(p3 + nums[i], p4);
              p3 = p4;
              p4 = t;
         }
      }
      return p1 = p2 > p4 ? p2 : p4;
    

    }

``` 打家劫舍 II