在数组中查找总和为数值的第一对数字

问题描述 投票:1回答:4

我正在尝试解决以下Codewars问题:https://www.codewars.com/kata/sum-of-pairs/train/python

这是我当前在Python中的实现:

def sum_pairs(ints, s):
    right = float("inf")

    n = len(ints)
    m = {}
    dup = {}

    for i, x in enumerate(ints):
        if x not in m.keys():
            m[x] = i # Track first index of x using hash map. 
        elif x in m.keys() and x not in dup.keys():
            dup[x] = i

        for x in m.keys():
            if s - x in m.keys():
                if x == s-x and x in dup.keys():
                    j = m[x]
                    k = dup[x]
                else:
                    j = m[x]
                    k = m[s-x]


                comp = max(j,k)
                if comp < right and j!= k:
                    right = comp


    if right > n:
        return None

    return [s - ints[right],ints[right]]

该代码似乎产生了正确的结果,但是输入可以包含最多10000000个元素的数组,因此对于大输入而言,执行会超时。我需要优化/修改代码的帮助,以便它可以处理足够大的数组。

python optimization memoization
4个回答
0
投票

您的代码对于大型列表测试用例效率低下,因此会出现超时错误。相反,您可以执行:

def sum_pairs(lst, s):
    seen = set()
    for item in lst:
        if s - item in seen:
            return [s - item, item]
        seen.add(item)

我们将这些值放入缓存中,直到找到一个使用缓存的值之一产生指定总和的值。有关更多信息,请访问:Referance link


0
投票

也许这个代码:

def sum_pairs(lst, s):
    c = 0
    while c<len(lst)-1:
        if c != len(lst)-1: 
            x= lst[c]
            spam = c+1
            while spam < len(lst):
                nxt= lst[spam]
                if nxt + x== s:
                    return [x, nxt]
                spam += 1
        else:
            return None
        c +=1
lst = [5, 6, 5, 8]
s = 14
print(sum_pairs(lst, s)) 

输出:

[6, 8]

0
投票

我试图遵循您的代码或至少保留类似的逻辑:

def sum_pairs(ints, s):

    m = {}

    for i in range(len(ints)):
        x = ints[i]

        if x > s:
            continue

        m[i] = x

        # assuming dict is ordered by insertion order as of v3.6
        for j in m:
            if i == j:
                continue
            if m[j] + x == s: 
                return x, m[j]

    return None # no pair has been found

-1
投票

有大量外部库可用于处理和处理大于内存的数组,即:

请注意,这些都是使用numpy阵列的所有numpy接口。要分配比数组更多的大小,可以用字典代替数组。

© www.soinside.com 2019 - 2024. All rights reserved.