题意:从一个数组中找到三个数,使这三个数的和为0。有可能存在多组解,也有可能存在重复的解,所以需要去重。比如:num=[-1,0,1,2,-1,-4];那么存在两组解:[[-1,0,1],[-1,-1,2]],解中的数需要是从小到大排序状态。
步骤:1. 先将数组排序。
2. 按照TwoSum的思路来解题。怎么解呢?将num[i]的相反数即-num[i]作为target,然后从i+1到len(num)-1的数组元素中寻找两个数使它们的和为-num[i]。下标i的范围是从0到len(num)-3。
3. 这个过程要注意去重。 时间复杂度:n(o^2)
class Solution:
def threeSum(self, num):
num.sort()
res = []
for i in range(len(num) - 2):
if i==0 or num[i]>num[i-1]:
left =i+1, right = len(num)-1, target=0-num[i]
while left<right:
if num[left] + num[right]==target:
res.append([num[i],num[left],num[right]])
left +=1; right -=1
#去重
while left < right and num[left]==num[left-1]:
left +=1
while left < right and num[right]==num[right-1]:
right -=1
elif num[left] + num[right] > target:
left +=1
if num[left-1] < num[left]: # 防止相邻两元素相同
break
elif num[left] + num[right] < target:
right -=1
if num[right] < num[right+1]:
break
return res
reference: