我正在尝试解决以下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个元素的数组,因此对于大输入而言,执行会超时。我需要优化/修改代码的帮助,以便它可以处理足够大的数组。
您的代码对于大型列表测试用例效率低下,因此会出现超时错误。相反,您可以执行:
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
也许这个代码:
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]
我试图遵循您的代码或至少保留类似的逻辑:
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
有大量外部库可用于处理和处理大于内存的数组,即:
请注意,这些都是使用numpy
阵列的所有numpy
接口。要分配比数组更多的大小,可以用字典代替数组。