213. 打家劫舍二 (Java) Leecode

在这里插入图片描述
这个问题二与一的区别是,第一个房屋和最后一个是紧挨着的,所有数组可以理解为一个环形。

这里要考虑的两种情况:

第一种,假设取数组第一个元素,那数组最后一个元素就不会被取到。
第二种,假设取数组最后一个元素,那数组第一个元素就不会被取到。

剩下的代码和一相似。 打家劫舍一

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

		//在这两种情况下,把数组分段,分别取最后值最大的情况。
        return Math.max(robRange(Arrays.copyOfRange(nums, 0, nums.length - 1)), 
                        robRange(Arrays.copyOfRange(nums, 1, nums.length))  );
 }

    public int robRange(int[] nums) {

        int n = nums.length;

        int prev = 0; // dp[n-2]
        int cur = 0; // dp[n-1]
        
        for(int i = 0; i < n; i++){
            int temp = Math.max(cur, prev + nums[i]); //dp[n]
            prev = cur; 
            cur = temp;                  
        }
        return cur;
    }
}

版权声明:本文为weixin_46442179原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。