LeetCode/solutions/198. House Robber.md

60 lines
1.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [198. House Robber](https://leetcode.com/problems/house-robber/description/)
# 思路
简单动态规划。
设直到第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;
}
};
```