Update 198. House Robber.md

This commit is contained in:
ShusenTang 2019-12-10 11:10:04 +08:00 committed by GitHub
parent b8deeca12c
commit 10b2e82f6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,5 +1,6 @@
# [198. House Robber](https://leetcode.com/problems/house-robber/description/) # [198. House Robber](https://leetcode.com/problems/house-robber/description/)
# 思路 # 思路
## 思路一
简单动态规划。 简单动态规划。
设直到第i个街道小偷能获得最大的收益为dp[i], 有两种情况: 设直到第i个街道小偷能获得最大的收益为dp[i], 有两种情况:
* 若不偷这个街区则dp[i] = dp[i-1] * 若不偷这个街区则dp[i] = dp[i-1]
@ -7,11 +8,18 @@
即`dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])`. 即`dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])`.
时间复杂度和空间复杂度都为O(n) 时间复杂度和空间复杂度都为O(n)
## 空间优化 ## 思路一空间优化
注意到每次更新dp[i]时只会用到到nums中的nums[i]而不会用到之前的, 所以完全可以吧nums作为dp,这样空间复杂度就为O(1)但是修改了原数组nums. 很明显可以用动归常用的空间优化方法滚动数组来优化空间即用pre记录dp[i-1]空间复杂度为o(1)
## 空间优化且不改变原数组
用pre记录dp[i-1]这样既不改变原数组nums也使得空间复杂度为o(1), 完美 ## 思路二
还可以用更直观的方法,用两个变量 rob 和 notRob 分别表示抢当前的房子和不抢当前的房子所获最大钱数,那么在遍历的过程中,先用两个变量 preRob 和 preNotRob 来分别记录更新之前的值,则
* 由于 rob 是要抢当前的房子,那么前一个房子一定不能抢,即更新`rob = preNotRob + nums[i]`;
* 然后 notRob 表示不能抢当前的房子,那么之前的房子就可以抢也可以不抢,即更新`notRob = max(preRob, preNotRob)`。
最后返回`max(rob, notRob)`即可。时间复杂度O(n)空间复杂度也是O(1)
# C++ # C++
## 思路一
``` C++ ``` C++
class Solution { class Solution {
public: public:
@ -26,20 +34,8 @@ public:
} }
}; };
``` ```
## 空间优化
``` C++ ## 思路一空间优化
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];
}
};
```
## 空间优化且不修改原数组
``` C++ ``` C++
class Solution { class Solution {
public: public:
@ -57,3 +53,19 @@ public:
} }
}; };
``` ```
## 思路二
``` C++
class Solution {
public:
int rob(vector<int>& nums) {
int rob = 0, notRob = 0, n = nums.size();
for (int i = 0; i < n; ++i) {
int preRob = rob, preNotRob = notRob;
rob = preNotRob + nums[i];
notRob = max(preRob, preNotRob);
}
return max(rob, notRob);
}
};
```