需要让我的算法更快

时间:2017-01-04 23:14:37

标签: python algorithm performance math

我需要让我的程序更快,但我无法弄清楚如何。这是问题所在。我有一系列数字排序如下:

7
4 8
2 5 9
1 3 6 10

 7
  \
 4 8
  \ \
 2 5 9
  \ \ \
 1 3 6 10

我必须根据输入输出一个数字。输入将是两个整数,将它们视为x和y坐标。 x 是我离开的左边有多少,y是从底部走多少。所以说 x y 是1和1,那么我必须输出5.

 7

 4 8

 2-5 9
   |
 1 3 6 10

现在我的代码正常工作并获得正确的数字,但速度太慢了。

def answer(x, y):
    last_num = 1
    arr_hold = [[1]]
    for i in range(2, x+(y+2)):
        reg_hold = []
        for j in range(last_num + 1, i + last_num + 1):
            if j == (i + last_num + 1) - 1:
                last_num = j
            if i == (x+(y+2)) - 1:
                reg_hold.append(j)
    print reg_hold
    return reg_hold[x]

我能做些什么来加快速度吗? 最大 x y 可以是100000,最低是0

2 个答案:

答案 0 :(得分:3)

这是一个解决此问题的封闭式解决方案。底行的数字是三角形数字。您可以使用n*(n+1)//2计算它们。您可以通过计算正确的n并从它产生的三角形数字偏移来获得结果:

def answer(x, y):
    n = x + y + 1
    return n*(n+1)//2 - y

答案 1 :(得分:-1)

将输入存储为列表列表。反转刚刚阅读的列表列表。索引很简单。

m = [[7], [4, 8], [2, 5, 9], [1, 3, 6, 10]] 
m = m[::-1] # reverse m = [[1, 3, 6, 10], [2, 5, 9], [4, 8], [7]] 
x = 1 
y = 1 
print m[x-1][y-1]