Given an array nums of n integers, are there elements a, b, c in nums 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.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
Solution1:(TLE)Brute Force
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
for i in range(len(nums)):
for j in range(i+1,len(nums)):
for k in range(j+1,len(nums)):
if nums[i] + nums[j] + nums[k]==0:
res.append(tuple(sorted([nums[i],nums[j],nums[k]])))
return [list(i) for i in set(res)]
267 / 313 test cases passed.
Solution2:(TLE) Better brute force
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
temp = set()
nums.sort()
# print(nums)
for i in range(len(nums)-2):
if nums[i]>0: #多加了个剪枝
break
for j in range(i+1,len(nums)-1):
if nums[i]+nums[j]>0:
break
for k in range(j+1,len(nums)):
# print('i:',i,'j:',j,'k:',k)
# print(nums[i],' ',nums[j],' ',nums[k],' ',nums[i] + nums[j]+nums[k])
if nums[i]+nums[j]+nums[k]>0:
break
if nums[i] + nums[j]+nums[k]==0:
temp.add((nums[i],nums[j],nums[k]))
return [list(i) for i in temp]
283 / 313 test cases passed.
Solution3:(TLE)
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
temp = set()
nums.sort()
# print(nums)
for i in range(len(nums)-2):
if nums[i]>0:
break
for j in range(i+1,len(nums)-1):
if nums[i]+nums[j]>0:
break
for k in range(len(nums)-1,j,-1): #倒着搜索更快
# print('i:',i,'j:',j,'k:',k)
# print(nums[i],' ',nums[j],' ',nums[k],' ',nums[i] + nums[j]+nums[k])
if nums[i]+nums[j]+nums[k]<0:
break
if nums[i] + nums[j]+nums[k]==0:
temp.add((nums[i],nums[j],nums[k]))
return [list(i) for i in temp]
311 / 313 test cases passed.
Solution4:(TLE)
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
temp = set()
nums.sort()
for i in range(len(nums)-2):
if nums[i]>0:
break
left,right = i+1,len(nums)-1
while left<right:
if nums[i]+nums[left]+nums[right]>0:
right -= 1
continue
if nums[i]+nums[left]+nums[right]<0:
left += 1
continue
temp.add((nums[i],nums[left],nums[right]))
left += 1
right -= 1
return [list(i) for i in temp]
312 / 313 test cases passed.
确定了第一项之后,对于后两项用有序序列求和的方式更快。
Solution5:
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
temp = set()
nums.sort()
if len(nums)>=3 and nums[0]==nums[-1]==0: 对于全0的数组单独判断
return [[0,0,0]]
for i in range(len(nums)-2):
if nums[i]>0:
break
left,right = i+1,len(nums)-1
while left<right:
if nums[i]+nums[left]+nums[right]>0:
right -= 1
continue
if nums[i]+nums[left]+nums[right]<0:
left += 1
continue
temp.add((nums[i],nums[left],nums[right]))
left += 1
right -= 1
return [list(i) for i in temp]