四层循环?(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-1ans=[]n=len(nums)#留3个位置啦,afor 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#最大都小,可剪枝,换个aif x+nums[-3]+nums[-2]+nums[-1]<target:continue#第二个数bfor 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#最大都小,换个bif x+y+nums[-2]+nums[-1]<target:continue#然后可以开始双指针了c=b+1d=n-1while c<d:sum=x+y+nums[c]+nums[d]if sum>target:d-=1#相同的话结果也一样while c<d and nums[d]==nums[d+1]:d-=1elif sum<target:c+=1#一样while c<d and nums[c]==nums[c-1]:c+=1else:ans.append([x,y,nums[c],nums[d]])c += 1#重复数字跳过while c < d and nums[c] == nums[c - 1]: c += 1d -= 1while d > c and nums[d] == nums[d + 1]: d -= 1return 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:重复数字跳过,和【三数之和】一样