Mason_YKW 2022-05-05 13:06 采纳率: 0%
浏览 22

Leetcode 动态规划超时如何解决?

在leetcode刷动态规划时发现问题,每次使用topdown 方法的时候都会通过一半测试用例,然后就显示超出时间限制。比如说爬楼梯:

class Solution:
    
    def climbStairs(self, n: int) -> int:
        memo = [0]*(n+1)
        print(memo)
        return self.numberOfWays(memo,n)
        
    def numberOfWays(self,memo,m):
        #how many ways can climb from 1 to m stairs
        #base
        if m == 1: 
            memo[m] = 1 
            return memo[m]
        if m == 2: 
            memo[m] = 2 
            return memo[m]
        #recursive
        else:
            memo[m] = self.numberOfWays(memo,m-1) + self.numberOfWays(memo,m-2)
            return memo[m]

这样写的话,在第38个测试用例中就会超时。但如果改成bottom-up:

class Solution:
    
    def climbStairs(self, n: int) -> int:
        memo = {}
        memo[1] = 1
        memo[2] = 2
        for i in range(3,n+1):
            memo[i] = memo[i-1] + memo[i-2]
        return memo[n]

就没有问题,非常快就可以出结果。

但在上课的时候说top-down和bottom-up都是对的,而且时间复杂度也不会差很多(一般来讲),但为什么在leetcode上频繁出现这种情况?而且看题解里面也都是用的bottom-up,加之我个人比较擅长top-down的思路……所以想知道是不是bottom-up实践上来说就是比top-down快,而且leetcode只能接受bottom-up的方法?

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-05-05 16:04
    关注

    这两者时间还是差挺多的,动态规划的核心是避免重复计算子问题,你所写的top-down在递归的时候子问题还是重复算的,而buttom-up就没有重复计算,显然bottom-up更快。另外同样O(n)复杂度的话也可以差别很大,例如是n还是100n

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月5日

悬赏问题

  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员