# 题目描述

# 思路与题解

和前面题的思路蛮像的,关键在于比大小,因为题目有不能偷盗相邻的两个房间的限制,所以比大小的关键就是 max(dp[i-1], dp[i-2] + nums[i]) ,dp [i] 就表示新增了第 i 个房间后的最大收益,所以如果我第 i 个房间不偷,我能得到的最大收益就是 dp [i-1];如果我第 i 个房间偷了,那我 i-1 房间就不能偷了,所以我能得的最大收益就是 dp [i-2] + nums [i],是不是很 easy~~

当然啦,再稍微思考一下,可以用滚动数组把空间复杂度优化为 O (1)

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        int dp[n];
        dp[0] = nums[0];
        if (n < 2) {
            return dp[0];
        }
        dp[1] = max(nums[0], nums[1]);
        for (int i = 2; i < n; ++i) {
            dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
        }
        return dp[n-1]; 
    }
};
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n < 2) {
            return nums[0];
        }
        int prev = 0, curr = nums[0];
        for (int i = 1; i < n; ++i) {
            int next = max(curr, prev + nums[i]);
            prev = curr;
            curr = next;
        }
        return curr; 
    }
};
更新于 阅读次数

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

宇凌喵 微信支付

微信支付

宇凌喵 支付宝

支付宝