classSolution:defthreeSum(self, nums: List[int])-> List[List[int]]:
n=len(nums)
res=[]if(not nums or n<3):return[]
nums.sort()
res=[]for i inrange(n):if(nums[i]>0):return res
if(i>0and nums[i]==nums[i-1]):continue
L=i+1
R=n-1while(L<R):if(nums[i]+nums[L]+nums[R]==0):
res.append([nums[i],nums[L],nums[R]])while(L<R and nums[L]==nums[L+1]):
L=L+1while(L<R and nums[R]==nums[R-1]):
R=R-1
L=L+1
R=R-1elif(nums[i]+nums[L]+nums[R]>0):
R=R-1else:
L=L+1return res
defquickSort(list):iflen(list)<=1:returnlist
high =[]
low =[]
pivot =list.pop()for x inlist:if x >= pivot:
high.append(x)else:
low.append(x)return quickSort(low)+[pivot]+ quickSort(high)defthreeSum(nums):
length =len(nums)ifnot nums or length <3:return[]
numlist =[]
nums = quickSort(nums)for first inrange(length):if nums[first]>0:return numlist
if first >0and nums[first]== nums[first -1]:continue
R = length -1
L =(R - first)//2+ first
flag=0while first<R-1and L<R:if L<=first:while(L<R and nums[L]==nums[L+1]):
L=L+1
L=first+1breakelif L>=R:
L=first+1while(L<R and nums[L]==nums[L+1]):
L=L+1while(L<R and nums[R]==nums[R-1]):
R=R-1
L=L+1
R=R-1breakelif nums[first]+nums[L]+nums[R]==0:
numlist.append([nums[first],nums[L],nums[R]])while(L<R and nums[L]==nums[L+1]):
L=L+1while(L<R and nums[R]==nums[R-1]):
R=R-1
L=L+1
R=R-1breakelif nums[first]+nums[L]+nums[R]>0:if flag==0:
L=first+1else:
L=L-1breakelif nums[first]+nums[L]+nums[R]<0:
flag=1while L<R and nums[L]==nums[L+1]:
L+=1
L+=1while L<R:if L<=first:
L+=1if R<=L:
R+=1if R>=length:breakif(nums[first]+nums[L]+nums[R]==0):
numlist.append([nums[first],nums[L],nums[R]])while(L<R and nums[L]==nums[L+1]):
L=L+1while(L<R and nums[R]==nums[R-1]):
R=R-1
L=L+1
R=R-1elif(nums[first]+nums[L]+nums[R]>0):
R=R-1else:
L=L+1return numlist
nums3=[-2,-3,0,0,-2,1]print(threeSum(nums3))