四层循环?(doge)
和【三数之和】题目很类似
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
#a,b,c,d四个数,先固定两个数,那就是双指针问题了,令b=a+1,c=b+1,d=n-1
ans=[]
n=len(nums)
#留3个位置啦,a
for a in range(n-3):
x=nums[a]
#和三数之和那里一样,剪枝剪掉重复的
if a>0 and x==nums[a-1]:
continue
#最小都大,可剪枝,后面肯定更大,所以可以退出了
if x+nums[a+1]+nums[a+2]+nums[a+3]>target:
break
#最大都小,可剪枝,换个a
if x+nums[-3]+nums[-2]+nums[-1]<target:
continue
#第二个数b
for b in range(a+1,n-2):
y=nums[b]
#同样要跳过重复数字
if b>a+1 and y==nums[b-1]:
continue
#最小都大,打包退出了
if x+y+nums[b+1]+nums[b+2]>target:
break
#最大都小,换个b
if x+y+nums[-2]+nums[-1]<target:
continue
#然后可以开始双指针了
c=b+1
d=n-1
while c<d:
sum=x+y+nums[c]+nums[d]
if sum>target:
d-=1
#相同的话结果也一样
while c<d and nums[d]==nums[d+1]:
d-=1
elif sum<target:
c+=1
#一样
while c<d and nums[c]==nums[c-1]:
c+=1
else:
ans.append([x,y,nums[c],nums[d]])
c += 1
#重复数字跳过
while c < d and nums[c] == nums[c - 1]:
c += 1
d -= 1
while d > c and nums[d] == nums[d + 1]:
d -= 1
return ans
过
总结:
- 数组排序
- 四个数,我们可以设定2个数(a,b=a+1),两层循环
- c,d双指针(c=b+1,d逆序)
- 剪枝1:前4个数最小都大于target,后续肯定更大,break(a和b设定都要)
- 剪枝2:前+后共4数之和最大都比target小,只能跳过寻求更大的,continue(a和b设定都要)
- 剪枝3:重复数字跳过,和【三数之和】一样