15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
Example
input |
---|
nums = [-1, 0, 1, 2, -1, -4] |
output |
[ [-1, 0, 1], [-1, -1, 2] ] |
Note
注意:答案中不可以包含重复的三元组。
思路
经典双指针问题
- 首先很容易想到先对数组进行排序
- 排序完之后,从第一个开始判断,以 s [ 0 ] s[0] s[0]为例,从 [ 1 , n ] [1,n] [1,n]中找到满足 s [ i ] + s [ j ] + s [ 0 ] = 0 s[i]+s[j]+s[0]=0 s[i]+s[j]+s[0]=0的对数
- 利用双指针+排序数组,让两个指针 l l l和 r r r从两边向内移动
- 如果 s [ l ] + s [ r ] + s [ 0 ] > 0 s[l]+s[r]+s[0]>0 s[l]+s[r]+s[0]>0,那么将 r r r向左移动
- 如果 s [ l ] + s [ r ] + s [ 0 ] = 0 s[l]+s[r]+s[0]=0 s[l]+s[r]+s[0]=0,那么将 s [ 0 ] , s [ l ] , s [ r ] s[0],s[l],s[r] s[0],s[l],s[r]加入到结果中
- 如果 s [ l ] + s [ r ] + s [ 0 ] < 0 s[l]+s[r]+s[0]<0 s[l]+s[r]+s[0]<0,那么将 l l l向右移动
- 注意一下去掉重复的,基本上就这样过了,复杂度 O ( n 2 ) O(n^2) O(n2)
代码如下
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
if not nums or n < 3:
return []
ans = []
nums.sort()
for i in range(n):
if nums[i] > 0 or i == n - 2:
break
elif i > 0 and nums[i] == nums[i-1]:
continue
l, r = i+1, n-1
while l < r:
if nums[i] + nums[l] + nums[r] == 0:
ans.append([nums[i], nums[l], nums[r]])
while l < r and nums[l] == nums[l+1]:
l += 1
while l < r and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
elif nums[i] + nums[l] + nums[r] > 0:
r -=1
else:
l +=1
return ans