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:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
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)
暴力法应该是
O(N3)
,的时间复杂度,初步估计最少也需要
O(N2)
的时间复杂度,所以先排序
(O(Nlog(N)))
,从小到大,然后到正数的时候停下。
参考之前的twoSum,相当于是遍历一遍,然后对每个遍历的
Si
,以
−Si
为target,往后找twoSum.
代码如下:
class Solution(object):
def threeSum(self, nums):
nums = sorted(nums)
res = []
if len(nums)<3:
return []
for y in xrange(len(nums)):
if nums[y]>0:
break
if y > 0 and nums[y] == nums[y-1]:
continue
res = self.twoSum(nums,-nums[y], y, res)
return res
def twoSum(self, nums, target, y, res):
dict={}
for i in xrange(len(nums)):
if y >=i:
continue
x=nums[i]
if target-x in dict:
mlist = sorted([target-x, x, nums[y]])
if mlist in res:
continue
res.append(mlist)
continue
dict[x]=i
return res