文章目录
本题与 两数之和类似,是非常经典的面试题,但是做法不尽相同。这两道题都值得深入研究,多次回顾。
一、题目
二、解法:数组排序 + 双指针
如果直接用暴力枚举,即三重循环,会执行超时。
数组排序 + 双指针的 code 如下:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
length=len(nums)
nums.sort()
ans=[]
for i in range(length-2):
# 由于nums升序,所以当nums[i]>0时,不然不可能出现三数之和为0的情况
if nums[i]>0:
break
# 防止ans中包含重复的三元组,continue表示跳出本次循环
if i>0 and nums[i]==nums[i-1]:
continue
left=i+1
right=length-1
while left<right:
sumTemp=nums[i]+nums[left]+nums[right]
if sumTemp==0:
ans.append([nums[i],nums[left],nums[right]])
left+=1
right-=1
# 这里必须要加 left<right 的判断,否则在 nums=[0,0,0,0] 这种情况下,left会一直增大直到数组越界
while left<right and nums[left]==nums[left-1]:
left+=1
while left<right and nums[right]==nums[right+1]:
right-=1
elif sumTemp<0:
left+=1
while left<right and nums[left]==nums[left-1]:
left+=1
else:
right-=1
while left<right and nums[right]==nums[right+1]:
right-=1
return ans