【问题标题】:Need to make my algorithm faster需要让我的算法更快
【发布时间】:2017-01-04 23:14:36
【问题描述】:

我需要让我的程序更快,但我就是不知道怎么做。这是问题所在。我有一个这样排序的数字序列:

7
4 8
2 5 9
1 3 6 10

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

我必须根据输入输出一个数字。输入将是两个整数,将它们视为 x 和 y 坐标。 x 是我从左边走多少,而 y 是我从底部走多少。所以说 xy 是 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]

有什么办法可以加快速度吗? xy 最大可以是 100000,最小可以是 0

【问题讨论】:

  • @UrielEli 你是什么意思?我告诉过你x是向右移动多少次,y是向上移动多少次。
  • 分析模式。数字与其坐标之间显然存在关系。如果你能弄清楚它是什么,就不需要循环了。
  • 如果你的代码没有错误,一个更好的提问地方可能是Code Review

标签: python algorithm performance math


【解决方案1】:

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

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

【讨论】:

  • 啊我的印象是这应该适用于任何数组列表:-)
【解决方案2】:

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

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]

【讨论】:

  • 存储这样的列表不是更好吗:[[1], [2, 3], [4, 5, 6]]?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多