边界范围需要严谨
双指针,内嵌一次遍历,先确保有两个固定值,再由指针确定后俩值;
指针一个从左,一个从右,共同往中间走,临界值:左边<右边
四个数 的都要跳过重复值,自+1
正常再+1 or -1
返回数组
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
res = []
n = len(nums)
if n<4:
return []
nums.sort()
res=[]
for i in range(n-3):
#数组内有重复值,要跳过
if i>0 and nums[i]==nums[i-1]:
continue
#以i为首的最小4数之和大于目标值,直接跳出
if nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target:
break
#以i为首的最大4数之和小于目标值,说明i太小,继续下一个
#0开始排序,最大下标是n-1
if nums[i]+nums[n-3]+nums[n-1]+nums[n-2]<target:
continue
for j in range(i+1,n-2):
#数组内有重复值,要跳过
if j-i>1 and nums[j] == nums[j-1]:
continue
#以i,j为首的最小4数之和大于目标值,直接跳出
if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
break
#以i,j为首的最大4数之和小于目标值,同理
if nums[i]+nums[j]+nums[n-2]+nums[n-1]<target:
continue
#最左最右双指针,left 右移,right 左移
left = j+1
right = n-1
while left<right:
temp = nums[i]+nums[j]+nums[left]+nums[right]
if temp==target:
res.append([nums[i],nums[j],nums[left],nums[right]])
while left<right and nums[left]==nums[left+1]:
left = left+1
while left<right and nums[right] == nums[right-1]:
right = right-1
left+=1
right-=1
elif temp>target:
right = right - 1
else:
left = left+1
return res