LeetCode213打家劫舍II

总体思路:

此题是198. 打家劫舍 的拓展版: 唯一的区别是此题中的房间是环状排列的(即首尾相接),
而 198题中的房间是单排排列的;

环状排列意味着第一个房子和最后一个房子中只能选择一个偷窃,
因此可以把此环状排列房间问题约化为两个单排排列房间子问题:

  • 在不偷窃第一个房子的情况下(即 nums[1:n-1]),最大金额是 p2
  • 在不偷窃最后一个房子的情况下(即nums[0:n−2]),最大金额是 p1
  • 综合偷窃最大金额: 为以上两种情况的较大值,即 max(p1,p2) 。
class Solution {
  public int rob(int[] nums) {
        int len = nums.length;
        if(len==0)
            return 0;
        if(len==1)
            return nums[0];
        return Math.max(dp(0,len-2,nums),dp(1,len-1,nums));
    }
    public int dp(int start,int last,int[] nums){
        int prev=0;
        int curr=nums[start];
        for(int i=start+1;i<=last;i++){
            int tmp = Math.max(prev+nums[i],curr);
            prev = curr;
            curr = tmp;
        }
        return curr;
    }
}
//写这道题时犯了想当然的错误,下意识地把for循环中i=start+2,延用了使用dp数组令i=2的想法
//但忽略了在dp数组那种写法中加的是nums[i-1],本质上还是从nums[1]开始遍历的
posted @ 2020-10-18 16:05  economies  阅读(90)  评论(0)    收藏  举报