给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找 和为目标值 target 的三个整数,并返回它们的数组下标
# 第一种:通过for循环遍历实现 class Foo(object): @staticmethod def sum(nums, target): result = [] n = len(nums) for i in range(n): for j in range(i+1,n): for k in range(j+1,n): num = nums[i] + nums[j] +nums[k] if num == target: result.append(i) result.append(j) result.append(k) break return result n = [5,1,2,4] print(Foo.sum(n,7))
# 第二种:列表推导式 # nums = [1,2,3,4,5,6,7,8,9] def fun(nums,target): list1 = [(x,y,z) for x,x1 in enumerate(nums) for y,y1 in enumerate(nums) for z,z1 in enumerate(nums) if x1!=y1!=z1 and x1+y1+z1==9] print(list1) nums = [5,1,2,4,7] target=9 fun(nums,target)
#第三种方法 def func1(nums,target): i = 0 while i < len(nums)-2: j = i+1 k = len(nums)-1 while j < k: if nums[i]+nums[j]+nums[k] > target: k -= 1 elif nums[i] + nums[j] + nums[k] < target: j += 1 else: return [i,j,k] i += 1 nums = [1,2,2,3,5] a = func1(nums,7)
#定义函数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 = [5,1,2,4,7,4,3,1]
#调用函数传入列表a及目标值7
threeSum(a, 7)