查找成对的数字加成一定值?

时间:2019-09-01 00:08:46

标签: python python-3.x algorithm

我有一个函数匹配,其中包含一个数字列表和一个目标数字,我想编写一个函数,该函数在数组中找到两个加到该目标的数字。

这是我的方法:


>>> def match(values, target=3):
...     for i in values:
...             for j in values:
...                     if j != i:
...                             if i + j == target:
...                                     return print(f'{i} and {j}')
...                             return print('no matching pair')

此解决方案有效吗?可以改善吗?

2 个答案:

答案 0 :(得分:1)

最好的方法是得到O(NlogN)解决方案。

  1. 您对列表进行排序,这将使您损失O(NlogN)
  2. 对列表进行排序后,您将获得两个索引,前者指向第一个元素,后者指向最新的元素,然后检查这些元素的总和是否符合您的目标。如果总和高于目标,则将较高的索引向下移动;如果总和低于目标,则将较低的索引向上移动。当较高的索引等于较低的索引时完成。此操作是线性的,可以在O(N)时间内完成。

总而言之,您拥有O(NlogN)进行排序,并拥有O(N)进行索引,从而使整个解决方案的复杂性变为O(NlogN)。

答案 1 :(得分:0)

还有改进的空间。现在,您有一个嵌套循环。另外,使用return时不会print

遍历values时,您将获得以下内容:

values = [1, 2, 3]
target = 3

first_value = 1
difference: 3 - 1 = 2

我们可以看到,为了使1等于3,需要2。与其在values上进行迭代,不如直接问2 in values

def match(values, target):
    values = set(values)
    for value in values:
        summand = target - value
        if summand in values:
           break
    else:
        print('No matching pair')
    print(f'{value} and {summand}')

编辑:将值转换为set的原因是,它比在in中查找它更快地处理list。如果您需要这些对的索引,例如在LeetCode问题中,则不应将其转换为set,因为您会丢失订单。您还应该在for循环中使用enumerate来获取索引。

编辑:summand == value边套

def match(values, target):
    for i, value in enumerate(values):
        summand = target - value
        if summand in values[i + 1:]:
           break
    else:
        print('No matching pair')
        return
    print(f'{value} and {summand}')