打家劫舍Ⅱ(LeetCode-213)

简介: 打家劫舍Ⅱ(LeetCode-213)

打家劫舍Ⅱ(LeetCode-213)


题目

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


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


示例 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 = [1,2,3]
输出:3


提示:


1 <= nums.length <= 100

0 <= nums[i] <= 1000


思路

当房间数不超过二,不需要考虑首尾


超过二时,因为不能同时偷首尾房间,所以可以分两种情况考虑


不偷最后一间情况:盗窃范围 n u m s [ 0 : n − 2 ]

不偷第一间情况:盗窃范围 n u m s [ 1 : n − 1 ]

二者取较大值


代码展示

class Solution
{
public:
    int rob(vector<int> &nums)
    {
        int n = nums.size();
        if (n == 1)
        {
            return nums[0];
        }
        int left = robRange(nums, 0, n - 2);
        int right = robRange(nums, 1, n - 1);
        return max(left, right);
    }
    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 - 1], dp[i - 2] + nums[i]);
        }
        return dp[end];
    }
};
目录
相关文章
|
7月前
力扣337.打家劫舍3(树形dp)
力扣337.打家劫舍3(树形dp)
|
7月前
|
Java
leetcode-198:打家劫舍
leetcode-198:打家劫舍
43 0
leetcode-198:打家劫舍
|
7月前
|
Java
leetcode-213:打家劫舍 II
leetcode-213:打家劫舍 II
40 0
|
7月前
|
Java
leetcode-337:打家劫舍 III
leetcode-337:打家劫舍 III
46 0
打家劫舍篇
打家劫舍篇
73 0
打家劫舍问题
打家劫舍问题
leetcode 337 打家劫舍III
leetcode 337 打家劫舍III
85 0
leetcode 337 打家劫舍III
leetcode 213 打家劫舍II
leetcode 213 打家劫舍II
90 0
leetcode 213 打家劫舍II