【问题标题】:What makes the difference by creating a set in this code?在这段代码中创建一个集合有什么不同?
【发布时间】:2021-04-18 16:37:52
【问题描述】:

给定一个数字列表和一个数字 k,返回列表中的任意两个数字加起来是否为 k。 例如,给定[10, 15, 3, 7] 和 17 个中的 k,返回 true,因为 10 + 7 is 17
奖励:你能一次性完成吗?

我这样写了我的代码,我得到了上述输入的正确答案

x=[10,15,3,7]
y=17
for i in x:
    if (y-i) in x:
        print(True)
        break

并且也检查了其他代码以知道我是对还是错,并且许多人在他们的代码中使用了集合

def sum_exists(l,k):
    s = set()
    for x in l:
        if k-x in s:
           return True
        s.add(x)
    return False

我仍然不明白他们的代码和我的代码之间的区别。我错了吗?

集合的用途与我的代码不同?

【问题讨论】:

    标签: python python-3.x list set


    【解决方案1】:

    您的代码迭代列表一次并使用in 检查列表 - 总的来说,您在列表中运行了很多次。

    你可以用一组额外的空间一次性完成:

    x = [10,15,3,7]
    y = 17
    s = set()
    for i in x:  # go throug the list once
        if y-i in s: 
            return True
        s.add(i)
    return False
    

    检查是否在集合中是 O(1)(恒定时间),在列表中检查是 O(n)(线性时间)。如果您有一个包含 100 万个不等于 y 的 uniqe 数字的列表,您的代码将迭代 100 万次 1000001 次的列表 - 一次通过并检查 1000000 次。总时间为 O(1000001*1000000)

    如果你使用一个集合,它是 O(1000000)+1000000*O(1) 这“更好”,但它需要一些额外的空间/内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多