我是编程的新手,我的老师要求班级在法官系统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之间的数字
答案 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 ++中的解决方案大致相当,而不需要使用标准库。