【问题标题】:Are there any tips to make my Python code faster for Hackerrank?有什么技巧可以让我的 Python 代码在 Hackerrank 上运行得更快吗?
【发布时间】:2020-05-25 07:04:25
【问题描述】:

我正在尝试解决 Hackerrank 的编码问题,但由于我的代码运行时间过长而不断遇到超时错误。我知道它工作得很好,缩进不是问题,代码没有任何“错误”。我只需要有关如何使其更高效运行的提示:

def main(n, o, q, m): 
    for x in m:
        for y,z in enumerate(o):
            x -= z
            if x<=0:
                print y+1
                break
        if x>0: print -1

o 和 m 是一个整数列表,通过从 m 中减去 o 的值进行循环,直到 m 小于 0,循环结束并且 m 仍然不小于 0,它将打印 -1。最终目标是从 o 中找出哪个 int 完成 m。

【问题讨论】:

  • 你可以预先计算o的部分和。
  • 修复if x&gt; 0 : .... 的缩进,以及您究竟将尝试将break 排除在循环之外,如果不删除break 和打印语句,您是否要同时执行if 语句需要() 在他们身边
  • @PeterWood 我无法预先计算,因为我需要获取完成金额的索引。
  • @FishingCode 我已经更新了问题,一旦我找到完成 m 的值,我就会跳出循环,ifx&gt;0: ... 是如果 m 的值在循环之后没有完成,它将打印-1
  • 问题可以重新打开吗?我想我让它更专注了。

标签: python performance coding-efficiency


【解决方案1】:

您正在使用om 的每个循环执行减法。

要提高性能,您需要循环mless 或循环oless。

循环oless 的一种方法是预先计算所有部分和。

x 减去了来自o 的值。也许你只会减去一个数字,或两个,或一千。谁知道?您将为m 的每个循环都这样做。

例如,如果 x 是 10,而 o[2, 4, 6, 8],则第三项将完成循环,第三项是 1224 的总和,和6

建立一个部分和列表意味着只需进行一次加法。

itertools.accumulate 可以为您做到这一点。

如果o 值可以是正数或负数,那么您需要进行线性搜索,因为部分和不会按升序排列。 (也许你可以使用一个聪明的数据结构,但我不知道。)

但是,如果 o 的值都是正数,您可以对部分和进行二分搜索。

请参阅this answerPython binary search-like function to find first number in sorted list greater than a specific value

【讨论】:

  • 非常感谢!使用累积和二分搜索有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多