文巾解题 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. 打家劫舍的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-动态规划-day3

LeetCode刷题笔记-动态规划-day3

Leetcode198. 打家劫舍(经典动态规划+优化)

java刷题--198打家劫舍

代码随想录算法训练营第四十七天| 198 打家劫舍 213 打家劫舍II 337 打家劫舍III

代码随想录算法训练营第四十八天 | 198.打家劫舍 213.打家劫舍II337.打家劫舍III