首页 > 解决方案 > 如何通过减少循环和调节来优化我的代码

问题描述

这是我的问题:

给定一个数字列表和数字“k”,返回列表中的任何两个数字加起来是否为“k”

例如,给定[1,2,5,6]wherek是 7,返回True因为 2+5 是 7。

这是我的代码;我想要一些关于如何矢量化它的帮助。

L = [3,4,1]
k = 5
for i in L:
    for j in L:
        if i+j == k:
            print("True")
            break
    if i+j == k:
        break

标签: pythonalgorithm

解决方案


矢量化似乎在这里没有帮助。

但是,我提出了一种新算法,可以将复杂度从 O(N^2) 降低到 O(N):

L = [3,4,1]
Lset = set(L)
k = 5

for x in L:
    if k - x in Lset:
        print("True")
        break

我认为该算法是不言自明的!:) 它基本上会遍历L每个数字,并检查其“互补”(满足 所需的数字x + complimentary == k)是否存在于列表中(转换为一组以降低成员资格检查成本)。

如果您不想计算 , 之类的情况L = [1]k = 2可以这样做:

for x in L:
    if k - x in Lset:
        if k - x == x and L.count(x) < 2:
            continue
        print("True")
        break

推荐阅读