【问题标题】:How to Find another Integer that Sums up to Target number in the List in O(n)? [duplicate]如何在 O(n) 的列表中找到另一个与目标数相加的整数? [复制]
【发布时间】:2018-06-15 03:07:09
【问题描述】:

假设我们有一个列表A,其中包含整数。

A = [2,4,5,6,7]

然后给定一个目标整数t

t = 6

我想找到一个包含两个元素的索引元组,通过总结得出t

return [0,1]

我使用了我的 python 并编码如下:

def myMethod(A,t):
    for i in range(len(A)):
        for j in range(i,len(A)):
            if A[i] + A[j] == target:
                return([i,j])

这行得通,但有人告诉我有更好的方法平均只需要 O(n) 复杂度。

这怎么可能?

有什么提示吗?

【问题讨论】:

标签: python algorithm


【解决方案1】:

是的,这可以在 O(n) 中完成。诀窍是保留每个数字在列表中的位置的倒排索引。

完成后,您可以遍历列表并查看您请求的总和与当前元素之间的差异是否在列表中,如果是,则在哪里。由于dict 使用散列进行查找,所以最后一步在 O(1) 中完成。

def find_sum(s, lst):
    indices = {x: i for i, x in enumerate(lst)}

    for i, x in enumerate(lst):
        target = s - x
        if target in indices:
            return (i, indices[target])

    return None

lst = [2, 4, 5, 6, 7]
print(find_sum(6, lst)) # (0, 1)

此解决方案可以通过使indices 存储索引集而不是单个索引来调整以返回所有此类对。

【讨论】:

  • 如果将 [if target in lst] 嵌套在 for 循环中,不是 n^2 吗?
  • @Beverlie 抱歉,我的意思是如果目标在索引中
  • @oh,dict 查找只是 1 对。
  • 是的,由于这个原因,此解决方案仅适用于可散列对象。对于可比较但不可散列但不是更好的对象,这可以设为 O(n log(n))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2012-09-26
  • 1970-01-01
  • 2020-03-30
  • 2023-02-09
相关资源
最近更新 更多