如何解决为什么这段代码比我的效率高?
我正在学习如何使用 HankerRank 在这个网站上做 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)
解决方法
超时意味着您做的工作比需要的多。
room.sort()
- 你为什么要sort
房间号列表?该代码没有利用它。 (奇怪,其他代码也是这样做的,我是不是忽略了什么?)
roomset=set(room.copy())
- 无需复制
但主要问题不是:房间号在列表中出现了多少次?,而是:它正好是 1 吗?。如果你第二次遇到房间号,你就有了答案,你应该停止计数。
更高效的代码就是这样做的。它会记住它是否见过房间号(集合 a
)以及它是否是第一次出现(集合 b
)。不算数,即只浏览一次列表就足够了——这是一个重要的效率改进。检查所有数字后,集合 b
仅包含恰好出现一次的项目。
因为 For 循环 和 room.count(i) 给出了 O(n) * O(n) = O(n**2) 的时间复杂度。虽然教程解决方案等于 O(n)
,你的代码很慢的原因是因为在你的循环的每次迭代中,python 需要扫描整个列表来计算数字出现的次数。这意味着在最坏的情况下,操作次数随着输入大小的平方增长,这使得它需要很长时间。
本教程的代码只保留了至少遇到过一次的一组数字 (a
) 和刚遇到过一次的一组数字 (b
)。插入、删除和检查成员资格的集合操作都是常数时间,所以他们的算法时间随着输入的长度线性增长。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。