做题思路:
1)首先对数组进行排序
2)创建一个for循环: 第一个元素指向for循环
3)然后创建一个while循环;第二个元素指向for循环的下一个元素,第三个元素指向最后一个元素
4)如果三个元素之和=target, 输出结果;如果三个元素之和>target, 第三个元素指针左移动;如果三个元素之和<target, 第二个元素指针右移动
题目一:三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
def sumThree():
nums = [-1,0,1,2,-1,-4]
nums.sort()
#[[-1,-1,2],[-1,0,1]]
res = []
n = len(nums)
for i in range(n):
j = i+1
k = n-1
if(nums[i]>0):
return res
if(i>0 and nums[i] == nums[i-1]):
continue
while(j<k):
if(nums[i]+nums[j]+nums[k]==0):
res.append([nums[i], nums[j],nums[k]])
while(j<k and nums[j] == nums[j+1]):
j+=1
while(j<k and nums[k] == nums[k-1]):
k-=1
j+=1
k-=1
elif(nums[i]+nums[j]+nums[k]>0):
k-=1
elif(nums[i]+nums[j]+nums[k]<0):
j+=1
return res
题目二:四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
def sumFore():
nums = [1,0,-1,0,-2,2]
target = 0
res = []
if not nums or len(nums)<4:
return res
nums.sort()
n = len(nums)
for i in range(n-3):
if(i>0 and nums[i] == nums[i-1]):
continue
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target):
break
if(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]<target):
continue
for j in range(i+1, n-2):
if(j>i+1 and nums[j]==nums[j-1]):
continue
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target):
break
if(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target):
continue
k = j+1
m = n-1
while(k<m):
if(nums[i]+nums[j]+nums[k]+nums[m]==target):
res.append([nums[i], nums[j], nums[k], nums[m]])
while(k<m and nums[k+1] == nums[k]):
k+=1
k+=1
while(k<m and nums[m-1] == nums[m]):
m-=1
m-=1
elif(nums[i]+nums[j]+nums[k]+nums[m]>target) :
m-=1
else:
k+=1
return res