链接
https://leetcode-cn.com/problems/3sum/
前言
题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例2:
输入:nums = []
输出:[]
示例3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-10^5 <= nums[i] <= 10^5
关键
思路1
- 先排序,简化问题
- 固定i,找另外两个值,使得三个数之和
sum
等于0sum=0
时:将三个数的位置加到数组res
里,然后继续查找下一个sum>0
时:right
向左走sum<0
时:left
向右走
- 双指针找另外两个值:left向右,right向左
- 注意跳过重复数字,简化时间复杂度(3个地方简化)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for i in range(n):
if i>0 and nums[i]==nums[i-1]:
continue
left = i+1
right = n-1
while left < right:
sum = nums[i] + nums[left] +nums[right]
if sum==0:
tmp = [nums[i], nums[left], nums[right]]
res.append(tmp)
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
elif sum > 0:
right-=1
else:
left+=1
return res