# 题目描述

# 思路与题解

这道题看起来不难,不就在上一道题的基础上添加了首尾房间相邻的限制吗,但我尝试解了三次都失败了,太丢人了 🤣

悄咪咪的看了一下题解,一句关键的话语瞬间就扩展了我的思路

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

原来如此,我之前一直钻在当计算到最后一间房屋的时候,如何知道第一件房间到底是抢了还是没抢,就一直加条件去判断,结果越加越繁琐,繁琐了还不对

看到题解的这句话我就恍然大悟了,我真是笨呐,第一件房和最后一间房不能同时考虑,那我就用两个 for 循环去计算就好啦,三下五除二,五分钟写完,一次性通过~

果然,思路才是最重要的!

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];
        if (n == 2) return max(nums[0], nums[1]);
        if (n == 3) return max(max(nums[0], nums[1]), nums[2]);
        int prev = 0, curr = nums[0];
        // 先计算排除最后一间房的价格
        for (int i = 1; i < n-1; ++i) {
            int next = max(curr, prev + nums[i]);
            prev = curr;
            curr = next;
        }
        int r1 = curr;
        prev = 0, curr = nums[1];
        // 再计算排除第一间房的价格
        for (int i = 2; i < n; ++i) {
            int next = max(curr, prev + nums[i]);
            prev = curr;
            curr = next;
        }
        return max(r1, curr);
    }
};
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

宇凌喵 微信支付

微信支付

宇凌喵 支付宝

支付宝