- class Solution:
- def threeSum(self, nums: List[int]) -> List[List[int]]:
- res=[]
- nums=sorted(nums)
- for i in range(len(nums)):
- if i>0 and nums[i]==nums[i-1]:
- continue
- if nums[i]>0:
- break
- l=i+1
- r=len(nums)-1
- while r>l:
- total=nums[i]+nums[l]+nums[r]
- if total>0:
- r-=1
- elif total<0:
- l+=1
- else:
- res.append([nums[i],nums[l],nums[r]])
- while r>l and nums[l]==nums[l+1]:
- l+=1
- while r>l and nums[r]==nums[r-1]:
- r-=1
- l+=1
- r-=1
- return res
- 排序数组:首先对数组进行排序,以便使用双指针方法。
- 遍历数组:使用一个循环遍历数组,每次选择一个元素作为三元组的第一个元素。
- 跳过重复元素:如果当前元素与前一个元素相同,则跳过,以避免重复的三元组。
- 初始化双指针:左指针
l初始化为i + 1,右指针r初始化为数组末尾。 - 双指针查找:使用双指针查找满足条件的三元组。
- 如果三数之和小于 0,移动左指针以增加总和。
- 如果三数之和大于 0,移动右指针以减少总和。
- 如果找到一个三元组,添加到结果列表中,并跳过重复的元素。
- 返回结果:返回所有满足条件的三元组。
注意排序,注意跳过重复元素(在3.5部分都有体现),当nums[i]>0时直接结束
- class Solution:
- def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
- nums.sort()
- res=[]
- for i in range(len(nums)):
- if nums[i]*4>target:
- break
- if i>0 and nums[i]==nums[i-1]:
- continue
- for l in range(i+1,len(nums)):
- if l>i+1 and nums[l]==nums[l-1]:
- continue
- if nums[i]+nums[l]*3>target:
- break
- left=l+1
- right=len(nums)-1
- while left<right:
- total=nums[i]+nums[l]+nums[left]+nums[right]
- if total>target:
- right-=1
- elif total<target:
- left+=1
- else :
- res.append([nums[i],nums[left],nums[right],nums[l]])
- while left<right and nums[left]==nums[left+1]:
- left+=1
- while left<right and nums[right]==nums[right-1]:
- right-=1
- left+=1
- right-=1
- return res
- 表扬下自己,四行代码(6,7,13,14)让运行时间几乎减半,应该是进一步剪枝了