[英]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.