当前位置: 首页 > 知识库问答 >
问题:

为什么我的DP算法有时间限制超过错误

公孙宏远
2023-03-14

我是DP的初学者,我正在尝试解决一个Leetcode问题-最大子数组:给定一个整数数组nums,找到具有最大和的连续子数组(至少包含一个数字),并返回其和。我知道这个问题已经有很多DP解决方案。但我想自己写一个DP解决方案,我在网上搜索了一些关于DP的介绍。以下是我使用的具体参考资料:https://stackoverflow.com/a/13538715/9982458.根据该答案,DP的运行时间为O(n)。为什么我收到代码超过时间限制的错误?如有任何意见,将不胜感激!谢谢

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp = {} # dp[i] means maxSubArray for nums[0:i] which must has A[i-1] as the end element.
        m = nums[0]
        def DP(nums):
            if len(nums) in dp: 
                return dp[len(nums)]
            else:
                if len(nums) == 1: 
                    f = nums[-1]
                else:
                    temp = DP(nums[0:-1])
                    if temp > 0:
                        f = temp + nums[-1]
                    else:
                        f = nums[-1]
                dp[len(nums)] = f
                return f
        DP(nums)
        for i in range(1, len(nums)):
            m = max(m, dp[i])
        return m

共有1个答案

左博学
2023-03-14

既然评论部分的人已经解释了为什么你的解决方案很慢,让我向你展示一个更简单的解决方案:

public int maxSubArray(int[] nums) {
    int max = Integer.MIN_VALUE;
    int maxEndingHere = 0;
    for (int value : nums) {
        maxEndingHere = Math.max(0, maxEndingHere) + value;
        max = Math.max(max, maxEndingHere);
    }
    return max;
}

它的工作原理基本上是检查该点上可能出现的最大和子阵列。

 类似资料:
  • 问题内容: 我刚刚发现,运行日历脚本时,PHP中的时间戳限制为2038。这实际上是什么意思?为什么是2038,而不是2050或2039?如果时间戳仅是从给定日期(1970年)起算的秒数,为什么还要设置限制? 问题答案: 该限制是由大多数C库用来表示该计数的4字节带符号整数强加的。快速数学(假设365天年,并非完全正确): 这也意味着下限约为1900。一些库已经开始引入64位纪元计数,但目前它们之间

  • 问题内容: 如何限制/减少的超时时间?我正在抓取一个网站。对于出现在成千上万页中的表,我可以有一个元素说明没有信息,也可以有一个表。我搜索这些元素之一,而当缺少时,我搜索其他元素。问题在于,当其中一个不存在时,要花很长时间才能超时。这段时间可以缩短吗?可以为每个元素定义超时期限吗?我发现有关等待的所有内容都是为了延长超时时间…如果可以,我正在.NET环境中工作。 问题答案: 延迟是由“隐式等待”设

  • 我有一个java Spring应用程序在AWS C4上运行。大(4 Gb内存)与Apache Tomcat 8.我得到java.lang.OutOfMemoryError GCOverhead限制超过错误,同时在服务器启动期间实例化30000条记录的bean。 引起原因:org.springframework.beans.BeanInstantiation异常:未能实例化[java.lang.字符

  • 我真的很困惑为什么我的Java代码不起作用,它给了黑客地球上的代码僧侣TLE。这里是指向1的链接 链接质疑第一个问题和尚和旋转 我不知道为什么它给了TLE我想这是一个无限循环。 现场的问题是- 蒙克和旋转蒙克喜欢对数组执行不同的操作,所以作为哈克地球学校的校长,他给他的新学生米什基布置了一个任务。Mishki将被提供一个大小为N的整数数组A和一个整数K,在这里她需要将数组向正确的方向旋转K步,然后

  • 我可能做了一些非常基本的错误,但我找不到任何关于如何从这一点上站出来的指针,我想知道我如何才能避免这一点。由于我是Scala和Spark的新手,我不确定问题是来自其中一个还是另一个,或者两者都有。我目前正在我自己的笔记本电脑上运行这个程序,它适用于数组长度不是很长的输入。提前谢了。

  • 我成功地解决了Hackerrank上的一个问题,它通过了所有测试用例,但我得到了一个错误,时间限制超过。我猜如果我优化我的代码,它会起作用,但我想不出任何方法来使我的代码更有效率。 问题是:对大小为n的数组进行左旋操作会将数组的每个元素向左移动1个单位。例如,如果在数组[1,2,3,4,5]上执行两次左旋转,则该数组将变为[3,4,1,2]。 给定一个由n个整数和一个数字d组成的数组,在数组上执行