题意:从一个数组中找到三个数,使这三个数的和为0。有可能存在多组解,也有可能存在重复的解,所以需要去重。比如:num=[-1,0,1,2,-1,-4];那么存在两组解:[[-1,0,1],[-1,-1,2]],解中的数需要是从小到大排序状态。 步骤:1. 先将数组排序。 2. 按照TwoSum的思路来解题。怎么解呢?将num的相反数即-num作为target,然后从i+1到len(num)-1的数组元素中寻找两个数使它们的和为-num。下标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>num[i-1]:
left =i+1, right = len(num)-1, target=0-num
while left<right:
if num[left] + num[right]==target:
res.append([num,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:
while left<right:
left +=1
if num[left-1] < num[left]: # 去重
break
elif num[left] + num[right] > target:
while left<right:
right -=1
if num[right] < num[right+1]: # 去重
break
return res
reference: ---------------------作者:千里江河 来源:CSDN 原文:blog.csdn.net/qinghange/ … 版权声明:本文为博主原创文章,转载请附上博文链接!
|
|