Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0?
Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
题意:在数组S中找到三个元素相加和为0,当然要去重
思路:采用快速排序法只排一次,每次取一个数x,问题转化为target-x的2sum问题
时间复杂度为O(n^2)
注意去重在三个地方:
第一个:每次取一个数,只将该元素后续的列表中查找target-x的2sum和;
第二个:每次取一个数,需要判断是否和前一个数重复(循环起始数除外),只有不重复才进行2sum计算,重复则continue
第三个:在进行2sum计算,若2sum的和等于target后,需要将左右指针移位,过滤后续重复元素,直到元素不重复再计算2sum之和
Runtime: 202 ms
class Solution(object):
'''
快速排序,递归的思想
'''
def qksort(self,nums):
if len(nums)<=1:
return nums
base=nums[0]
left=[]
right=[]
for i in nums[1:]:
if i<base:
left.append(i)
else:
right.append(i)
left=self.qksort(left)
right=self.qksort(right)
return left+[base]+right
def threeSum(self, nums):
if len(nums)<3:
return []
nums=self.qksort(nums)
#nums=sorted(nums)
triple=[]
for i in range(0,len(nums)-2):
if nums[i]!=nums[i-1] or i==0:#去重
target=0-nums[i]
l=i+1
r=len(nums)-1
while l<r:
s=nums[l]+nums[r]
if s==target:
triple.append([nums[i],nums[l],nums[r]])
l+=1
r-=1
while l<r and nums[l]==nums[l-1]:
l+=1
while l<r and nums[r]==nums[r+1]:
r-=1
elif s<target:
l+=1
else:
r-=1
return triple