1. 审题
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]
]
2. 解题
给定一个数组,求三个数和为0的所有组合。这些组合要求不重复。
2.1 暴力解法
对数组排序,三重for循环,返回值设置为set,有值为0的组合加入其中。
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = set()
nums.sort()
for i in xrange(len(nums) - 2):
j = i + 1
while j < len(nums) - 1:
k = j + 1
while k < len(nums):
if nums[i] + nums[j] + nums[k] == 0:
result.add((nums[i], nums[j], nums[k]))
k = k + 1
j += 1
return result
运行结果正确,提交之后超时了。
2.1 双指针夹逼
首先对数组进行排序,选中一个元素保持不动,左右两个指针分别指向选中元素的下一个位置,以及数组末尾。
求这三个元素的和,如大于0,说明和太大了,要把最大的元素减小,右指针左移。若和小于0, 说明和太小了,左指针右移。如和刚好为0,则把当前的值加入结果。然后对左指针,右指针进行去重处理。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
nums.sort()
for i in xrange(len(nums) - 2):
if i > 0 and nums[i] == nums[i-1]:
continue
left, right = i + 1, len(nums) - 1
while left < right:
if nums[left] + nums[right] + nums[i] < 0:
left += 1
elif nums[left] + nums[right] + nums[i] > 0:
right -= 1
else :
result.append((nums[i],nums[left], nums[right]))
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
return result