LeetCode/198. House Robber.md
2018-10-13 00:07:28 +08:00

1.8 KiB
Raw Blame History

198. House Robber

思路

简单动态规划。
设直到第i个街道小偷能获得最大的收益为dp[i], 有两种情况:

  • 若不偷这个街区则dp[i] = dp[i-1]
  • 若偷这个街区则dp[i] = dp[i-2] + nums[i]。

dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]).
时间复杂度和空间复杂度都为O(n)

空间优化

注意到每次更新dp[i]时只会用到到nums中的nums[i]而不会用到之前的, 所以完全可以吧nums作为dp,这样空间复杂度就为O(1)但是修改了原数组nums.

空间优化且不改变原数组

用pre记录dp[i-1]这样既不改变原数组nums也使得空间复杂度为o(1), 完美

C++

class Solution {
public:
    int rob(vector<int>& nums){
        if(nums.empty()) return 0;
        if(nums.size() == 1) return nums[0];
        vector<int>dp(nums.size());
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); i++) dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
        return dp[nums.size() - 1];
    }
};

空间优化

class Solution {
public:
    int rob(vector<int>& nums){
        if(nums.empty()) return 0;
        if(nums.size() == 1) return nums[0];
        nums[1] = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); i++) nums[i] = max(nums[i - 1], nums[i - 2] + nums[i]);
        return nums[nums.size() - 1];
    }
};

空间优化且不修改原数组

class Solution {
public:
    int rob(vector<int>& nums){
        if(nums.empty()) return 0;
        if(nums.size() == 1) return nums[0];
        int tmp, res, pre = nums[0];
        res = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); i++) {
            tmp = res;
            res = max(res, pre + nums[i]);
            pre = tmp;
        }
        return res;
    }
};