题目: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] ]
思路:先排个序,从左到小于等于0的位置开始固定一个值,两个左右指针分别从哨兵的左边和数组末端开始查找,直到l>r。为了避免重复,first\l\r都跳到下一个不重复的位置上。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if not nums or len(nums)<3:return []
nums.sort();re = []
first = 0;l = 1;r = len(nums)-1
while first<r-1 and nums[first]<=0:
while l<r:
f = nums[first]+nums[l]+nums[r]
if f<0:
l+=1
while l<r and nums[l-1]==nums[l]:l+=1
elif f>0:
r-=1
while l<r and nums[r+1]==nums[r]:r-=1
else:
re.append([nums[first],nums[l],nums[r]])
l+=1;r-=1
while l<r and nums[l-1]==nums[l]:l+=1
while l<r and nums[r+1]==nums[r]:r-=1
if nums[first]==0:break
first+=1;r = len(nums)-1
while first<r-1 and nums[first-1]==nums[first]:
first+=1
l=first+1
return re