如何提高算法性能的速度,计算最小的移动次数?

时间:2017-05-18 22:52:32

标签: algorithm performance python-3.x loops cycle

我参与了codefights并让任务找到从输入获得严格增加的序列所需的最小移动次数。作为输入,有一些整数数组,并且符合规则我可以​​将每个元素的一个元素恰好增加一个数组。

inputArray: [1, 1, 1]
Expected Output:3

inputArray: [-1000, 0, -2, 0]
Expected Output:5

inputArray: [2, 1, 10, 1]
Expected Output:12

inputArray: [2, 3, 3, 5, 5, 5, 4, 12, 12, 10, 15]
Expected Output:13

还有输入和输出的条件:

[time limit] 4000ms (py3)
[input] array.integer inputArray
3 ≤ inputArray.length ≤ 105,
-105 ≤ inputArray[i] ≤ 105
[output] integer

我提出了以下解决方案:

def arrayChange(inputArray):
k=0
for i in range(len(inputArray)-1):
    if (inputArray[i]<inputArray[i+1]) == False:
        while inputArray[i+1]<=inputArray[i]:
            inputArray[i+1] = inputArray[i+1] + 1
            k +=1
return k

然而,对于某些我无法观察到我的算法性能的测试而言显然超出了时间限制:

  

6/8   测试7超出执行时间限制:程序超出了执行时间限制。确保在几秒钟内完成任何可能的输入执行。   样本测试:4/4   隐藏的测试:2/4

如何改进我的算法以提高性能速度?

3 个答案:

答案 0 :(得分:1)

现在你一次增加1。目前您有以下代码段:

inputArray[i+1] = inputArray[i+1] + 1

为什么不一次添加所有数字,而不是每次递增1?例如,如果您有列表[1, 3, 0],则将4添加到最后一个元素是有意义的。这样做比加入4次要快得多。

答案 1 :(得分:1)

@ fileyfood500给了我一个非常有用的提示,这是我的解决方案:

deltX=0
for i in range(len(a)-1):
    if (a[i]<a[i+1]) == False:
        deltX1 = abs(a[i+1]-a[i])+1
        a[i+1] = a[i+1] + deltX1
        deltX += deltX1
print(deltX)

现在我根本不需要while循环,因为我增加了项目,应该在一步中增加必要的数量。

答案 2 :(得分:1)

def arrayChange(inputArray):
    count = 0
    for i in range(1,len(inputArray)):
        while inputArray[i] <= inputArray[i-1]:
            c = inputArray[i]
            inputArray[i]= inputArray[i-1]+1
            count += inputArray[i] - c 
    return count

这样你可以直接增加它,时间也会减少 然后只需从前一个值中减去新值,即可得到它增加的次数。