难度中等2919收藏分享切换为英文接收动态反馈
给你一个包含 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
-105 <= nums[i] <= 105
双指针:
循环遍历第1个数,第2、3个数在循环内做双指针求2数之和。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort() # 先从小到大排序
counts = len(nums)
res = []
# 第一个数的下标从0开始,nums个数-2结束,做循环,其它2个数做双指针两数之和
for i, v in enumerate(nums):
if (v > 0):
break
if (i > 0) and v == nums[i-1]:
continue # 第1个数去重
left = i + 1 # 左指针
right = counts - 1 # 右指针
while left < right:
if v + nums[left] + nums[right] < 0:
left +=1 # 左指针右移
elif v + nums[left] + nums[right] > 0:
right -=1 # 右指针左移
else:
res.append([v, nums[left], nums[right]])
left +=1 # 左指针右移
right -=1 # 右指针左移
while (left < right) and (nums[left] == nums[left-1]):
left += 1 # 第2个数去重
while (left < right) and (nums[right] == nums[right+1]):
right -= 1 # 第3个数去重
return res