代码实现:
def threeSum(alist, targetnum):
for i, j in enumerate(alist):
for m, n in enumerate(alist[i+1:]):
realM = i+m+1
k = i+m+2
if alist[k:].count(targetnum - (j+n)) > 0:
for x in range(alist[k:].count(targetnum - (j+n))):
y = alist.index(targetnum - (j+n), k)
print(i, realM, y)
k = y+1
a = [1, 3, 4, 6, -3, 4, 1, 3, 8, 9, 3, 0, -3]
threeSum(a, 7)
输出结果:
0 1 7
0 1 10
0 3 11
0 4 9
0 7 10
0 9 12
1 2 11
1 5 11
1 6 7
1 6 10
2 3 4
2 3 12
2 7 11
2 10 11
3 4 5
3 5 12
3 6 11
4 6 9
5 7 11
5 10 11
6 7 10
6 9 12
逐行说明:
#定义函数threeSum接收参数为列表及目标值
def threeSum(alist, targetnum):
#假设这三个数分别为a,b,c和为targetnum,此处设置第一重循环,获取循环获取a的下标和值
for i, j in enumerate(alist):
#此处设置第二重循环用于获取b的下标和值
for m, n in enumerate(alist[i+1:]):
#由于b的下标和值使用了切片操作每次取i+1后值,每次获取的下标m不是在原列表中的实际为,所以需要通过计算realM得到b在原列表的实际位置
realM = i+m+1
#根据i和m的值计算c在原列表中取值的起始位置,由于c需要在b后面一位开始取值,所以需要+2
k = i+m+2
#通过统计c出现次数,判断targetnum - (j+n)是否出现在列表索引k位置之后
if alist[k:].count(targetnum - (j+n)) > 0:
#c值在列表索引k位置之后可能出现多次,此处用循环取得所有c值
for x in range(alist[k:].count(targetnum - (j+n))):
#使用index函数获取c值对应的下标索引
y = alist.index(targetnum - (j+n), k)
#打印一组a,b,c值对应的索引下标
print(i, realM, y)
#重置c值的搜索起始位置为y+1
k = y+1
#定义输入列表数据
a = [1, 3, 4, 6, -3, 4, 1, 3, 8, 9, 3, 0, -3]
#调用函数传入列表a及目标值7
threeSum(a, 7)