Leetcode213. House Robber II
相对于House Robber I多了个首尾相连的限制,其实也就是多了一个“抢房间0就不能抢房间n-1”的约束。而这个约束限制我们不能用老的转移方程来计算dp数组。
那么怎么打破这个约束呢?
其实就是高考21题的分类思想:
分成我们抢房间0(不抢房间n-1)和不抢房间0(可以抢房间n-1)两种,分别求dp再取最大值,时间复杂度不变。
class Solution { public int rob(int[] nums) { if(nums==null||nums.length<1) return 0; if(nums.length==1) return nums[0]; return Math.max(subRob(nums,0,nums.length-2),subRob(nums,1,nums.length-1)); } private int subRob(int[] nums,int start,int end){ int length = end-start+1; if(length==1) return nums[start]; int[] dp = new int[nums.length];//避免后面数组出界 dp[start] = nums[start]; dp[start+1] = nums[start+1]; int max = Math.max(dp[start],dp[start+1]); if(length==2) return max; dp[start+2] = dp[start]+nums[start+2]; max = Math.max(max,dp[start+2]); for(int i=3;i<length;i++){ dp[i+start] = Math.max(dp[start+i-2],dp[start+i-3])+nums[start+i]; if(dp[start+i]>max) max = dp[i+start]; } return max; } }
Runtime: 2 ms, faster than 100.00% of Java online submissions for House Robber II.
Memory Usage: 36.8 MB, less than 52.99% of Java online submissions forHouse Robber II.

浙公网安备 33010602011771号