class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
length=len(nums)
result=[]
if length<4:
return []
for i in range(length-3):
if i>0 and nums[i-1]==nums[i]:
continue
if nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target:
break
if nums[i]+nums[length-3]+nums[length-2]+nums[length-1]<target:
continue
for j in range(i+1,length-2):
if j - i > 1 and nums[j-1]==nums[j]:
continue
if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
break
if nums[j]+nums[length-3]+nums[length-2]+nums[length-1]<target:
continue
left=j+1
right=length-1
while left<right:
sums=nums[i]+nums[j]+nums[left]+nums[right]
if sums==target:
result_temp=[nums[i],nums[j],nums[left],nums[right]]
if result_temp not in result:
result.append(result_temp)
if left<right and nums[left]==nums[left+1]:
left+=1
if left<right and nums[right]==nums[right-1]:
right-=1
left+=1
right-=1
elif sums<target:
left+=1
else:
right-=1
return result
虽然自己也可以写一写简单的双指针,但是优化做的还是不够好,大神的优化太厉害了,首先是相同的数跳过,这个是之前也用过的,关键是要搞懂为什么在range()里面的坐标,length-2和length-3都可以,而-3可以用到进一步的优化之中