diff --git a/198. House Robber.md b/198. House Robber.md new file mode 100644 index 0000000..021df32 --- /dev/null +++ b/198. House Robber.md @@ -0,0 +1,59 @@ +# [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& nums){ + if(nums.empty()) return 0; + if(nums.size() == 1) return nums[0]; + vectordp(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& 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& 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; + } +}; +```