我需要让我的程序更快,但我无法弄清楚如何。这是问题所在。我有一系列数字排序如下:
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
答案 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]