思路展示

如何才能保证第一间房屋和最后一间房屋不同时偷窃呢?如果偷窃了第一间房屋,则不能偷窃最后一间房屋,因此偷窃房屋的范围是第一间房屋到最后第二间房屋;如果偷窃了最后一间房屋,则不能偷窃第一间房屋,因此偷窃房屋的范围是第二间房屋到最后一间房屋。

假设数组 nums 的长度为 n。如果不偷窃最后一间房屋,则偷窃房屋的下标范围是 [0,n−2];如果不偷窃第一间房屋,则偷窃房屋的下标范围是 [1,n−1]。

示例代码

class Solution {
public:
    int robRange(vector<int>& nums,int start,int end){
        int len=nums.size();
        vector<int> dp(len+1);
        dp[start]=nums[start];
        dp[start+1]=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++){
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[end];
    }

    int rob(vector<int>& nums) {
        int len=nums.size();
        if(len==1){
            return nums[0];
        }else if(len==2){
            return max(nums[0],nums[1]);
        }else{
            //用去掉第一个元素或者去掉最后一个元素的办法把环拆开
            return max(robRange(nums,0,len-2),robRange(nums,1,len-1));
        }
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

效果展示

LeetCode---213. 打家劫舍 II(动态规划,用去掉第一个元素或者去掉最后一个元素的办法把环拆开)_i++