超出了Python时间限制

时间:2018-04-16 14:05:46

标签: python python-3.x

我是编程的新手,我的老师要求班级在法官系统URI中做一个感觉练习

当我尝试this exercise时,URI系统说我的代码超过了限制时间,并在2秒内运行。我的代码是:

cont=0
cont_register=int(input())
coords=[]
for i in range(cont_register):
    coords.append(input())
for i in range(0, cont_register):
    if coords.count(coords[i])>1:
        cont=1
        break
    else:
        cont=cont
print(cont)

输出总是正确的,但我想知道是否有表格可以优化运行时间,因为cont_register是2到500.000之间的数字

3 个答案:

答案 0 :(得分:0)

尝试使用collections.Counter

from collections import Counter

cont_register=int(input())

coords=[]

for i in range(cont_register):
    coords.append(raw_input())

coords=Counter(coords)

print(int(coords.most_common(1)[0][1] > 1))

如果您可以检查input,这是最快的选择:

cont_register=int(input())
seen = set()
cont = 0
for i in range(cont_register):
    new = input()
    if new in seen:
        cont = 1
        break
    else:
        seen.add(new)
print(cont)

答案 1 :(得分:0)

循环中的coords.count是对整个列表的另一次搜索,从而使运行时为O(n ^ 2)。您可以使用字典来实现哈希表,并使搜索速度更快,并在获取输入的同时进行重复检查(使用已经采用的输入!)。

此代码使用python3运行。我无法检查URI判断,因为我在页面上找不到任何提交链接。但是,它应该在限制范围内运行。

cont=0
cont_register=int(input())
coords={}
for i in range(0,cont_register):
    inp=input()
    if inp not in coords.keys():
        coords[inp]=1
    else:
        cont=1
        break #if you don't want to continue taking inputs
print(cont)

答案 2 :(得分:0)

一种直接的方法是使用嵌套列表(在C / C ++ /等中也称为2D数组)来标记已经访问过的象限。

逐个遍历输入中的条目,并检查它们是否已被访问过。如果是,则将答案设置为1并停止处理进一步的输入。否则,将seen列表中的相应条目设置为True,以指示已访问该特定(X,Y)象限。

这意味着您需要最多遍历一次列表,这与您获得的效率大致相同。

请注意,X和Y被限制在500以下,因此这些是您需要担心的列表的限制。

seen = [[False] * 501] * 501 
answer = 0
n = int(input())
for i in range(n):
    x, y = [int(_) for _ in input().split(' ')]
    if seen[x][y]:
        answer = 1
        break
    seen[x][y] = True
print(answer)

但是,请注意,这个解决方案并不完全是Pythonic,但它与C或C ++中的解决方案大致相当,而不需要使用标准库。