代码改变世界

[LeetCode] 198. House Robber _Easy tag: Dynamic Programming

2018-07-17 05:10  Johnson_强生仔仔  阅读(265)  评论(0编辑  收藏  举报

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
             Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
             Total amount you can rob = 2 + 9 + 1 = 12.

这个题目的思路就是用DP(Dynamic programming), 就是我们要找到A[i] 跟它前面几个元素的关系, 这个题目我用三种方法, 第一种是用pre, sec, 第二种是用O(n) Space, 第三种用template的

滚动数组来解决类似的DP题目, 很牛逼.


1. Constraints
1) can be empty
2)element is non-negative
3) edge case, when length < 3

2. ideas

DP T: O(n) S: O(1) optimal

1) edge case: l < 3: max([0] + nums)
2) A[i] = max(A[i-2] + nums[i], A[i-1])

利用滚动数组的时候, 因为当前状态跟之前两个状态有关, 所以模3, % 3 即可将S: O(n) decrease into O(1)

3. Codes

1) use pre, sec
1 class Solution:
2     def houseRopper(self, nums):
3         l = len(nums)
4         if l < 3: return max([0] + nums)
5         pre, sec = nums[0], max(nums[:2])
6         for i in range(2, l):
7             ans = max(pre + nums[i], sec)
8             pre, sec = sec, ans
9         return sec

 

2) Template of DP      T: O(n)    S: O(n)

1 class Solution:
2     def houseRopper(self, nums):
3         n = len(nums)
4         if n < 3: return max([0] + nums)
5         f = [0]*n6         f[0], f[1] = nums[0], max(nums[:2])
7         for i in range(2, n):
8             f[i] = max(f[i-2] + nums[i], f[i-1])
9         return f[n - 1]

 

3) DP  滚动数组      T: O(n)    S: O(1)

1 class Solution:
2      def houseRopper(self, nums):
3          n = len(nums)
4          if n < 3: return max([0] + nums)
5          f = [0]*3
6          f[0], f[1] = nums[0], max(nums[:2])
7          for i in range(2, n):
8              f[i % 3] = max(f[(i - 2)% 3] + nums[i], f[(i - 1) % 3])
9          return f[(n - 1) % 3]

 

4. Test cases

1)  edge cases

2) 

[2,7,9,3,1]