我正在学习如何使用这个网站使用Hankerak制作python。我遇到了this problem,我编写的代码没有通过一些测试,因为超过了时间限制。所以我上了youtube,使用了一个教程,他的代码很有效,但我不明白为什么他的代码比我的更有效。如果有人能解释一下,我将不胜感激
我的代码:
room=list(map(int, input().split()))
room.sort()
roomset=set(room.copy())
for i in roomset:
if room.count(i)!=K:
print(i)
else:
continue
教程代码:
room=list(map(int, input().split()))
room.sort()
a=set()
b=set()
for i in room:
if i not in a:
a.add(i)
b.add(i)
else:
b.discard(i)
for o in b:
print(o)
因为For loop和room.count(i)给出了O(n)*O(n)=O(n**2)时间复杂度。而教程解等于O(n)
超过时间意味着你做的工作比要求的多
room.sort()
-你为什么要sort
列出房间号码?代码没有利用它。(奇怪,另一个代码也这么做了,我是否忽略了什么?)roomset=set(room.copy())
-无需复制但主要的问题不是:一个房间号码在列表中出现了多少次?,而是:它到底是1吗?。如果你第二次遇到房间号码,你有答案,你应该停止计数
更高效的代码就是这样做的。它会记住是否看到房间号(set
a
)以及它是否是第一次出现(setb
)。不计算,即只需浏览列表一次即可-这是一项重要的效率改进。检查完所有数字后,集合b
只包含一个项目,且只出现一次代码运行缓慢的原因是,在循环的每次迭代中,python都需要扫描整个列表以计算该数字出现的次数。这意味着在最坏的情况下,操作的数量会随着输入大小的平方而增加,这会花费很长时间
本教程的代码只保留一组至少遇到过一次的数字(
a
),以及一组恰好遇到过一次的数字(b
)。插入、删除和检查成员资格的集合操作都是常数时间,因此其算法的时间随输入长度线性增长相关问题 更多 >
编程相关推荐