Skip to content

Commit 6c90264

Browse files
authored
Update 0198-打家劫舍.py
1 parent c7e6bd6 commit 6c90264

File tree

1 file changed

+46
-14
lines changed

1 file changed

+46
-14
lines changed
Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,46 @@
1-
class Solution(object):
2-
def rob(self, nums):
3-
"""
4-
:type nums: List[int]
5-
:rtype: int
6-
"""
7-
if len(nums) == 0:
8-
return 0
9-
if len(nums) <= 2:
10-
return max(nums)
11-
nums[1] = max(nums[0], nums[1])
12-
for i in range(2, len(nums)):
13-
nums[i] = max(nums[i - 2] + nums[i], nums[i - 1])
14-
return max(nums) if nums else 0
1+
状态定义
2+
设动态规划列表 dpdpdpdp[i]dp[i]dp[i] 代表前 iii 个房子在满足条件下的能偷窃到的最高金额
3+
4+
转移方程
5+
nnn 个房子 nnn 间能偷窃到的最高金额是 dp[n]dp[n]dp[n] , n1n-1n1 间能偷窃到的最高金额是 dp[n1]dp[n-1]dp[n1] ,此时向这些房子后加一间房此房间价值为 numnumnum
6+
加一间房间后由于不能抢相邻的房子意味着抢第 n+1n+1n+1 间就不能抢第 nnn 那么前 n+1n+1n+1 间房能偷取到的最高金额 dp[n+1]dp[n+1]dp[n+1] 一定是以下两种情况的 较大值
7+
8+
不抢第 n+1n+1n+1 个房间因此等于前 nnn 个房子的最高金额 dp[n+1]=dp[n]dp[n+1] = dp[n]dp[n+1]=dp[n] ;
9+
抢第 n+1n+1n+1 个房间此时不能抢第 nnn 个房间因此等于前 n1n-1n1 个房子的最高金额加上当前房间价值 dp[n+1]=dp[n1]+numdp[n+1] = dp[n-1] + numdp[n+1]=dp[n1]+num
10+
细心的我们发现难道在前 nnn 间的最高金额 dp[n]dp[n]dp[n] 情况下 nnn 间一定被偷了吗假设没有被偷 n+1n+1n+1 间的最大值应该也可能是 dp[n+1]=dp[n]+numdp[n+1] = dp[n] + numdp[n+1]=dp[n]+num 其实这种假设的情况可以被省略这是因为
11+
12+
假设第 nnn 间没有被偷那么此时 dp[n]=dp[n1]dp[n] = dp[n-1]dp[n]=dp[n1] ,此时 dp[n+1]=dp[n]+num=dp[n1]+numdp[n+1] = dp[n] + num = dp[n-1] + numdp[n+1]=dp[n]+num=dp[n1]+num即两种情况可以 合并为一种情况 考虑
13+
假设第 nnn 间被偷那么此时 dp[n+1]=dp[n]+numdp[n+1] = dp[n] + numdp[n+1]=dp[n]+num 不可取因为偷了第 nnn 间就不能偷第 n+1n+1n+1
14+
最终的转移方程
15+
dp[n+1] = max(dp[n],dp[n-1]+num)
16+
17+
初始状态
18+
19+
000 间房子的最大偷窃价值为 000 dp[0]=0dp[0] = 0dp[0]=0
20+
返回值
21+
22+
返回 dpdpdp 列表最后一个元素值即所有房间的最大偷窃价值
23+
简化空间复杂度
24+
25+
我们发现 dp[n]dp[n]dp[n] 只与 dp[n1]dp[n-1]dp[n1] dp[n2]dp[n-2]dp[n2] 有关系因此我们可以设两个变量 cur和 pre 交替记录将空间复杂度降到 O(1)O(1)O(1) 。
26+
27+
# 简化版
28+
class Solution:
29+
def rob(self, nums: List[int]) -> int:
30+
cur, pre = 0, 0
31+
for num in nums:
32+
cur, pre = max(pre + num, cur), cur
33+
return cur
34+
# 标准版
35+
class Solution:
36+
def rob(self, nums) -> int:
37+
n = len(nums)
38+
dp = [0]*(n+1)
39+
dp[1] = nums[0]
40+
for i in range(2,n+1):
41+
dp[i] = max(dp[i-1],dp[i-2]+nums[i-1])
42+
return dp[-1]
43+
# 作者:Krahets
44+
# 链接:https://leetcode.cn/problems/house-robber/solutions/28242/da-jia-jie-she-dong-tai-gui-hua-jie-gou-hua-si-lu-/
45+
# 来源:力扣(LeetCode)
46+
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 commit comments

Comments
 (0)