python - 如何通过减少循环和调节来优化我的代码
问题描述
这是我的问题:
给定一个数字列表和数字“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
解决方案
矢量化似乎在这里没有帮助。
但是,我提出了一种新算法,可以将复杂度从 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
推荐阅读
- python - 打印列表时如何同时使用逗号和方括号?(Python)
- singularity-container - 未能添加为会话目录:路径。不是奇点中的绝对路径
- python - 在应用程序之间传递数据 otree
- python - 相关字段的查找无效
- python - 随机选择每种类型的数据值并返回所选的索引
- ios - 获取对存储在 Firestore 数据库中的数据的引用
- javascript - 哪种方式可以最快地提出条件?
- ios - UICollectionView 水平和垂直滚动不同的单元格
- sql - 基于表的动态where子句
- c - 为什么 gdb 不能读取 io_uring_cqe 内容?