思路:与198题的区别是,本题的房子时环形的,即首位连接。
首先,首尾房间不能同时被抢,那么只可能有三种不同情况:要么都不被抢;要么第一间房子被抢最后一间不抢;要么最后一间房子被抢第一间不抢。
但是,只需要考虑情况二和情况三,取两种情况最大的即可。
因为,在计算这两种情况时,已经把都不抢的情况考虑到了。
因此,把原始数组分成 去头 和 去尾 两个队列的数据。
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(myRob(Arrays.copyOfRange(nums,0,n-1)), // myRob(Arrays.copyOfRange(nums,1,n))); return Math.max(myRob1(nums, 0, n-2), myRob1(nums,1,n-1)); } private int myRob(int[] nums) { int a = 0, b = 0; for (int i = 0; i < nums.length; i++) { int temp = Math.max(nums[i] + a, b); a = b; b = temp; } return b; } private int myRob1(int[] nums, int start, int end) { int a = 0, b = 0; for (int i = start; i <= end; i++) { int temp = Math.max(nums[i] + a, b); a = b; b = temp; } return b; } }