Math 从一个整数列表中找出所有数字对的最有效方法是什么?这些整数加起来就是一个单独的给定整数?

Math 从一个整数列表中找出所有数字对的最有效方法是什么?这些整数加起来就是一个单独的给定整数?,math,subset,Math,Subset,昨天我接受了一次采访,被要求给出一种方法,从一个列表中找出所有的数字对,这些数字加起来就是一个整数,这个整数是单独给列表的。列表可以无限长,但例如: numbers = [11,1,5,27,7,18,2,4,8] sum = 9 pairs = [(1,8),(5,4),(7,2)] 我对列表进行了排序,消除了所有大于总和的数字,然后做了两个嵌套for循环,以获取每个索引,并遍历其他数字,检查它们的总和是否等于给定的数字,但有人告诉我,有一种更有效的方法可以做到这一点 我一直在试图弄明白,

昨天我接受了一次采访,被要求给出一种方法,从一个列表中找出所有的数字对,这些数字加起来就是一个整数,这个整数是单独给列表的。列表可以无限长,但例如:

numbers = [11,1,5,27,7,18,2,4,8]
sum = 9

pairs = [(1,8),(5,4),(7,2)]
我对列表进行了排序,消除了所有大于
总和的数字,然后做了两个嵌套for循环,以获取每个索引,并遍历其他数字,检查它们的总和是否等于给定的数字,但有人告诉我,有一种更有效的方法可以做到这一点

我一直在试图弄明白,但除了向后进行嵌套迭代之外,我什么也没有,但这似乎只是稍微更有效率


有什么想法吗?

这是一个经典的问题,不确定stackoverflow是否是提出这种问题的合适地方

  • 按发送顺序对列表进行排序
  • 两个迭代器一个从列表末尾开始降序
    i1
    ,一个从列表开头开始升序
    i2
  • 环路
  • 而i1>i2
    if(列表[i1]+列表[i2]==目标)
    在结果对中存储{list[i1],list[i2])
    i1--
    i2++
    否则如果(列表[i1]+列表[i2]>目标)
    i1--
    否则如果(列表[i1]+列表[i2]<目标)
    i2++
    
    如果您避免使用排序算法,该算法应为O(n)中的
    n
    列表长度,该算法可通过O(n log n)中的平均快速排序来完成

    注意:此算法不考虑输入列表具有几倍相同数字的情况

    这可以在O(n)时间和O(n)辅助空间内完成;测试集合的成员资格需要O(1)时间。由于输出也需要O(n)空间,因此辅助空间不应该是一个重要问题

    def pairs_sum(数字,k):
    数字集=集(数字)
    如果(y:=k-x)在数字中且x
    例如:

    对和([11,1,5,27,7,18,2,4,8,9) [(1, 8), (2, 7), (4, 5)]
    排序不是O(n)时间。@kaya3你说得对,如果每次迭代程序都要检查y是否在列表中,我不太明白它是如何的O(n)?这肯定是一个O(n^2)操作?它不是检查y是否在列表中,而是检查y是否在集合中。
    while i1 > i2
        if (list[i1] + list[i2] == target)
            store {list[i1], list[i2]) in results pairs
            i1--
            i2++
        else if (list[i1] + list[i2] > target)
            i1--
        else if (list[i1] + list[i2] < target)
            i2++