leetcode-213:打家劫舍 II

简介: leetcode-213:打家劫舍 II

题目

题目链接

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [0]
输出:0

解题

方法一:动态规划

leetcode-198:打家劫舍的基础上,增加了首尾连成换,那么只需要考虑两种情况,1.不包含首元素 2.不含尾元素

然后取最大的一种即可

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        if(nums.size()==1) return nums[0];
        int res1=robRange(nums,0,nums.size()-2);//包含首元素,不包含尾元素
        int res2=robRange(nums,1,nums.size()-1);//包含尾元素,不包含首元素
        return max(res1,res2);//取两种情况的最大值
    }
    // 198.打家劫舍的逻辑
    int robRange(vector<int>& nums,int start,int end){
        if(start==end) return nums[start];
        vector<int> dp(nums.size());
        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];
    }
};

java

class Solution {
    public int rob(int[] nums) {
        if(nums.length==1) return nums[0];
        if(nums.length==2) return Math.max(nums[0],nums[1]);
        int leftV=robRange(nums,0,nums.length-2);
        int rightV=robRange(nums,1,nums.length-1);
        return Math.max(leftV,rightV);
    }
    int robRange(int[] nums,int left,int right){
        if(left==right) return nums[left];
        if(right-left==1) return Math.max(nums[left],nums[right]);
        int[] dp=new int[nums.length];
        dp[left]=nums[left];
        dp[left+1]=Math.max(nums[left],nums[left+1]);
        for(int i=left+2;i<=right;i++){
            dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[right];
    }
}


相关文章
|
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详解
72 2
|
4月前
|
Python
【Leetcode刷题Python】213. 打家劫舍 II
LeetCode 213题 "打家劫舍 II" 的Python解决方案,通过动态规划处理环形房屋的偷窃问题,计算在不触发警报的情况下能够偷窃到的最高金额。
22 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