【问题标题】:Can anyone help me reduce the execution time of my python code谁能帮我减少我的python代码的执行时间
【发布时间】:2017-07-26 20:51:23
【问题描述】:

时间限制是4000ms,但是输入太大,超过了执行时间限制。谁能告诉我在哪里以及如何优化我的代码。任务是:

给定一个整数序列作为数组,判断它是否是 可以通过不再删除来获得严格递增的序列 数组中的一个元素。

提前谢谢你。

PS:这个任务也可以在 CodeFights 上找到。

def almostIncreasingSequence(sequence): # The main function
    for x in range(0,len(sequence)):
         copyOfSequence = copySequence(sequence)
         del copyOfSequence[x]
         if checkSequence(copyOfSequence) == True:
             return True
    return False

def copySequence(sequence):    # Create a sequence that is the same with input
    copyOfSequence = sequence[::]
    return copyOfSequence

#Check if the sequence is a strictly increasing sequence when I remove a element
def checkSequence(sequence):
    for i in range(0, len(sequence) - 1):
        if sequence[i] >= sequence[i + 1]: return False
    return True

【问题讨论】:

  • 提示:你真的需要两个嵌套循环吗?
  • 复制和删除列表中间的元素是昂贵的操作。想出一个适用于原始列表的算法。
  • @Henry 我是新手,所以我的想法不是很好,我不知道其他方法可以替换函数 checkSequence 虽然两个嵌套循环会花费很多时间
  • @MarkTolonen 谢谢你的建议,我会努力的

标签: python-3.x optimization


【解决方案1】:

我不会在这里给你直接代码,因为这个问题来自编程领域。

如果数组长度为1,则不需要删除任何元素

否则

留下flag = 0

遍历数组的 1 到 lenght-1

  1. val =array[n]- array[n-1]
  2. 如果val < 0更新flag += 1
  3. if flag > 1 那么我们需要删除至少 2 个元素。

if flag < 2 那么给定的数组必须删除不超过 1 个元素。

您不需要通过 [:] 复制数组。

【讨论】:

  • 这个太简单了,考虑1 5 3 4 6; flag 将为 1,但仍然无法仅删除单个元素。
  • 如果我只删除 5 个?
  • 好吧,忽略了。使它成为 1 4 5 2 3 6。
【解决方案2】:

给定一个整数序列作为一个数组,确定是否可以通过从数组中删除不超过一个元素来获得一个严格递增的序列。

首先,取整个数组的运行差:

import numpy as np
d = np.diff(a)

然后数一下不为正的次数:

c = (d <= 0).sum()

如果 c 大于 1,这是不可能的。如果 c 为 0,则有可能。如果 c 为 1,找出它在哪里:

i = np.where(d <= 0)[0][0]

然后检查删除它是否会满足约束:

a[i-1] < a[i+1]

完成。

在 4 秒的时间限制内,我希望您可以检查一个包含大约 5000 万个元素(400 MB 数据)的数组。

【讨论】:

  • 非常感谢 =)) 很有帮助
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多