我有一个函数匹配,其中包含一个数字列表和一个目标数字,我想编写一个函数,该函数在数组中找到两个加到该目标的数字。
这是我的方法:
>>> 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')
此解决方案有效吗?可以改善吗?
答案 0 :(得分:1)
最好的方法是得到O(NlogN)解决方案。
总而言之,您拥有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}')