leetcode 213 打家劫舍II

简介: leetcode 213 打家劫舍II

打家劫舍II


a180cf620ff64c6fb46ef914c82b4ca2.png

其实就是把环拆成两个队列,一个是从0到n-1,另一个是从1到n,然后返回两个结果最大的。

动态规划

37a25f1162084c9ea6dde78adc5b5b67.png


而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了。

对情况二和情况三分别做打家劫舍,取最大

class Solution {
public:
    int robRange(vector<int>& nums, int start, int end) 
    {
        if((end - start) == 1 ) return nums[start];
        if((end - start) == 2) return max(nums[start],nums[start+1]);
        vector<int> dp((end - start) , 0);
        dp[0] = nums[start];
        dp[1] = max(nums[start],nums[start+1]);
        for(int i=2 ; i<(end - start) ;i++)
        {
             dp[i] = max(dp[i-1],dp[i-2]+nums[start+i]);
        }
        // for(auto it:dp) cout<<it<<' ';
        // cout<<endl;
        return dp[end-start-1];
    }
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        if(nums.size()==1) return nums[0];
        int result1 = robRange(nums,0,nums.size()-1);
        int result2 = robRange(nums,1,nums.size());
        // cout<<result1<<' '<<result2;
        return max(result1,result2);
    }
};


二刷

class Solution {
public:
    int robRange(vector<int>& nums , int left, int right)
    {
        vector<int> dp (right-left,0);
        dp[0] = nums[left];
        dp[1] = max(nums[left] , nums[left+1]);
        for(int i=2 ; i<right-left ;i++)
        {
            dp[i] = max(dp[i-1] , dp[i-2]+nums[i+left]);
        }
        return dp[right-left-1];
    }
    int rob(vector<int>& nums) {
        if(nums.size()==1) return nums[0];
        if(nums.size()==2) return max(nums[0],nums[1]);
        return max(robRange(nums,0,nums.size()-1) , robRange(nums,1,nums.size()));
    }
};
相关文章
|
7月前
|
Go
golang力扣leetcode 337.打家劫舍III
golang力扣leetcode 337.打家劫舍III
47 0
|
7月前
|
Go
golang力扣leetcode 198.打家劫舍
golang力扣leetcode 198.打家劫舍
41 0
|
7月前
leetcode代码记录(打家劫舍 III
leetcode代码记录(打家劫舍 III
39 0
|
4月前
|
移动开发 Python
【Leetcode刷题Python】337. 打家劫舍 III
LeetCode 337题 "打家劫舍 III" 的Python解决方案,使用递归和动态规划计算小偷在二叉树结构的房屋中不触发警报的情况下能够盗取的最高金额。
50 1
【Leetcode刷题Python】337. 打家劫舍 III
|
4月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
74 2
|
4月前
|
Python
【Leetcode刷题Python】213. 打家劫舍 II
LeetCode 213题 "打家劫舍 II" 的Python解决方案,通过动态规划处理环形房屋的偷窃问题,计算在不触发警报的情况下能够偷窃到的最高金额。
23 1
|
4月前
|
Python
【Leetcode刷题Python】198. 打家劫舍
LeetCode 198题 "打家劫舍" 的Python解决方案,使用动态规划计算小偷在不触发警报的情况下一夜之内能够偷窃到的最高金额。
42 1
|
7月前
力扣337.打家劫舍3(树形dp)
力扣337.打家劫舍3(树形dp)
|
7月前
力扣198.打家劫舍(简单动态规划)
力扣198.打家劫舍(简单动态规划)
|
7月前
leetcode代码记录(打家劫舍 II
leetcode代码记录(打家劫舍 II
34 3