给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————
解题思路:
首先将数组进行排序,将排序后的数值从小到大进行遍历。比如对nums[i]进行搜索,遍历范围为nums[i+1]到nums[length]。假设找到nums[i]+nums[j]+nums[k]==0,则找到一对符合要求的三元素值。
但是题目要求不能含有重复的三元组,因此我们需要对数据进行去重。
第一种情况是出现[-2,-2,0,2],这样会导致一种重复。
第二种情况是出现[-2,-1,-1,0,3],这样会导致另外一种重复,因此我们需要在代码中进行去重。
具体Python代码如下:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
length = len(nums)
if length <3: # 如果数组长度小于3,则直接返回空
return []
res = []
nums.sort() # 进行排序
for i in range(length): # 数组中的每个数字都作为搜索中心,取其右边的两个值进行运算
if nums[i]>0: # 当遍历到的数值大于0时则不可能存在其右边三个值等于0
return res
if i>0 and nums[i] == nums[i-1]: # 这是第一种去重,[-2,-2,0,2]
continue # 跳出比较下一个数值
L = i+1 # 第一个指针指向当前值的下一个值
R = length-1 # 第二个指针指向最后一个值
while L<R: # 两个指针分别向中间遍历
if nums[i] + nums[L] + nums[R] == 0: # 如果三个值为0,则符合要求
res.append([nums[i],nums[L],nums[R]])
while L<R and nums[L]==nums[L+1]: # 这是第二种去重,[-2,-1,-1,0,3]
L += 1
while L<R and nums[R]==nums[R-1]: # 这是第二种去重,[-3,0,1,1,2]
R -= 1
L+=1
R-=1
elif nums[i] + nums[L] + nums[R] >0: # 如果三个值的和大于0,则较大值变小
R-=1
else: # 如果三个值的和小于0,则较小值变大
L+=1
return res