mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
60 lines
1.8 KiB
Markdown
60 lines
1.8 KiB
Markdown
![]() |
# [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;
|
|||
|
}
|
|||
|
};
|
|||
|
```
|