class Solution(object):
def threeSum(self, nums):
# 思路:本题完全可以变成 指定值 + twoSum() 问题
# 声明承接满足条件的组合
res = []
# 异常处理 长度小于3 不满足题意
len_ = len(nums)
if len_ <= 2:
return res
# 将数据排序
nums.sort()
for i in range(len_):
# 由于题意是三数之和为0, 如果当前最小值大于0, 说明之后的组合无法满足题意
if nums[i] > 0:
break
# 重复处理, 若存在重复值, 则对应的三元组应该也是相同的, 所以跳过
if i > 0 and nums[i] == nums[i-1]:
continue
# 把三元问题变为 i + 【i : len()-1】 的问题
left = i + 1
right = len_ - 1
# 二元问题求解
# 两数之和 > target: 右指针左移变小
# 两数之和 < target: 左指针右移变大
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum == 0:
res.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
elif sum < 0: left += 1
elif sum > 0: right -= 1
return res