213. House Robber II

After robbing those houses on that street, 
the thief has found himself a new place for his thievery so that he will not get too much attention.
This time, all houses at this place are arranged in a circle.
That means the first house is the neighbor of the last one.
Meanwhile, the security system for these houses remain the same as for those in the previous street. Given a list of non-negative integers representing the amount of money of each house,
determine the maximum amount of money you can rob tonight without alerting the police. Credits: Special thanks to @Freezen
for adding this problem and creating all test cases.

这道题是之前那道House Robber 打家劫舍的拓展,现在房子排成了一个圆圈,则如果抢了第一家,就不能抢最后一家,因为首尾相连了,所以第一家和最后一家只能抢其中的一家,或者都不抢,那我们这里变通一下,如果我们把第一家和最后一家分别去掉,各算一遍能抢的最大值,然后比较两个值取其中较大的一个即为所求。那我们只需参考之前的House Robber 打家劫舍中的解题方法,然后调用两边取较大值,代码如下:

public int rob(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        if (nums.length == 1) return nums[0];
        int robNo = 0, robYes = nums[0];
        for (int i = 1; i < nums.length - 1; i++) {
            int temp = robNo;
            robNo = Math.max(robNo, robYes);
            robYes = temp + nums[i];
        }
        int ans = Math.max(robNo, robYes);
         robNo = 0;
         robYes = nums[1];
        for (int i = 2; i < nums.length; i++) {
            int temp = robNo;
            robNo = Math.max(robNo, robYes);
            robYes = temp + nums[i];
        }
        ans = Math.max(Math.max(robNo, robYes), ans);
        return ans;
        
    }

  

原文地址:https://www.cnblogs.com/apanda009/p/7284504.html