微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这段代码比我的效率高?

如何解决为什么这段代码比我的效率高?

我正在学习如何使用 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 举报,一经查实,本站将立刻删除。