列表中的对总和:记忆化、设计优化

Sum of pairs from list: memoization, design optimalization

从整数列表和单个总和值中,我必须 return 前两个值按出现顺序加起来等于总和。 source of the task

我认为最佳的扫描列表方式是:

  1. index 0, index 1
    
  2. index 0,          index 2
    
  3.          index 1, index 2
    
  4. index 0,                   index 3
    
  5.         index 1,           index 3
    
  6.                   index 2, index 3
    

等等。到目前为止我说得对吗?

然后我用memoization减少了出现两次以上的数字。

我编写的代码可以正常运行,但在更高级的测试中超时。在这里:

def sum_pairs(ints, s):
d={}
n2_index = 0
d[ints[0]] = 1
while True:
    n2_index += 1
    if ints[n2_index] not in d.keys():
        d[ints[n2_index]] = 0
        
    if d[ints[n2_index]] == 2:
        if n2_index == len(ints)-1:
            return None
        continue
    for n1_index in range (0, n2_index):

        if ints[n1_index] + ints[n2_index] == s:
            return [ints[n1_index], ints[n2_index]]
    
    d[ints[n2_index]] += 1
    
    if n2_index == len(ints)-1:
        return None

如果您能帮助我理解 mistake/mistakes 以及如何处理此类任务,我将不胜感激。 干杯!

方法是记住你以前见过的所有数字。这通常在一组中完成,一组为您提供 O(1)(常数)查找时间,因此您可以非常快速地确定是否已经看到特定数字。

正如您可以通过列表一样,您查看您的集合以查看您是否已经看到 sum - current_value。如果是这样,您可以输出这两个值,如果不是,则将 current_value 添加到集合中并继续。

def sum(ints, s):
    seen = set()
    for current_value in ints:
        if s - current_value in seen:
             return s-current_value, current_value
        else:
             seen.add(current_value)
    return None