繁体   English   中英

超过Python时间限制

[英]Python time limit exceeded

我是编程新手,我的老师要求全班在法官系统URI中进行练习

当我尝试执行此练习时 ,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之间的数字

尝试使用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)

循环中的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)

一种简单的方法是使用嵌套列表(在C / C ++ / etc中也称为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 ++所做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM