From 10b2e82f6baf9bca9f614ac6c2908323a499290a Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Tue, 10 Dec 2019 11:10:04 +0800 Subject: [PATCH] Update 198. House Robber.md --- solutions/198. House Robber.md | 48 +++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/solutions/198. House Robber.md b/solutions/198. House Robber.md index b0cc76c..d07d91a 100644 --- a/solutions/198. House Robber.md +++ b/solutions/198. House Robber.md @@ -1,5 +1,6 @@ # [198. House Robber](https://leetcode.com/problems/house-robber/description/) # 思路 +## 思路一 简单动态规划。 设直到第i个街道小偷能获得最大的收益为dp[i], 有两种情况: * 若不偷这个街区,则dp[i] = dp[i-1]; @@ -7,11 +8,18 @@ 即`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), 完美 +## 思路一空间优化 +很明显可以用动归常用的空间优化方法滚动数组来优化空间,即用pre记录dp[i-1],空间复杂度为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++ class Solution { public: @@ -26,20 +34,8 @@ public: } }; ``` -## 空间优化 -``` C++ -class Solution { -public: - int rob(vector& 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++ class Solution { public: @@ -57,3 +53,19 @@ public: } }; ``` + +## 思路二 +``` C++ +class Solution { +public: + int rob(vector& 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); + } +}; +```