文巾解题 198. 打家劫舍
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 198. 打家劫舍相关的知识,希望对你有一定的参考价值。
1 题目描述
2 解题思路
2.1 正向动态规划
从前向后找,我们记f(n,tmp)表示[0,n-1]的点中最大的偷窃金额总和为tmp,我们现在要考虑偷不偷n号点(下面的方法会超时!),step_now表示当前点偷,step_not_now表示当前点不偷
class Solution:
def rob(self, nums: List[int]) -> int:
l=len(nums)
def f(n,tmp):
if(n==l-1):
return(tmp+nums[n])
elif(n==l-2):
return(tmp+max(nums[n],nums[n+1]))
else:
step_now=f(n+2,nums[n]+tmp)
step_not_now=f(n+1,tmp)
return(max(step_now,step_not_now))
return(f(0,0))
上述代码中,同一个f(n,tmp)被多次使用,比较耗时。我们可以用一个字典将已经求得的f(n,tmp)记录下来。
class Solution:
def rob(self, nums: List[int]) -> int:
l=len(nums)
dit={}
def f(n,tmp):
if((n,tmp) in dit):
return(dit[(n,tmp)])
if(n==l-1):
dit[(n,tmp)]=tmp+nums[n]
return(tmp+nums[n])
elif(n==l-2):
dit[(n,tmp)]=tmp+max(nums[n],nums[n+1])
return(tmp+max(nums[n],nums[n+1]))
else:
step_now=f(n+2,nums[n]+tmp)
step_not_now=f(n+1,tmp)
dit[(n,tmp)]=max(step_now,step_not_now)
return(max(step_now,step_not_now))
return(f(0,0))
但是,这种方法的时间复杂度和空间复杂度是很高的
2.2 反向动态规划
从最后一个往前推
class Solution:
def rob(self, nums: List[int]) -> int:
if(nums==[]):
return 0
tmp=[]
for i in range(len(nums)):
tmp.append(-1)
tmp[len(nums)-1]=nums[len(nums)-1]
tmp[len(nums)-2]=max(nums[len(nums)-1],nums[len(nums)-2])
for i in range(len(nums)-3,-1,-1):
tmp[i]=max(tmp[i+1],tmp[i+2]+nums[i])
#print(tmp)
return(tmp[0])
这种方法的时间复杂度就低了很多
以上是关于文巾解题 198. 打家劫舍的主要内容,如果未能解决你的问题,请参考以下文章