#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time: 2019/3/14
# @Author: xfLi
# The file...
"""
问题分析:
与16题相似,可以先从小到大排序,然后固定一个值,从这个值的右区间开始,设置两个指针 left, right向0逼近。
(1)对nums从小到大排序。
(2)遍历(或者是枚举)取出一个值,并确定右区间和指针 left, right。
(3)确定当前三个数的和是否为0,移动指针 left, right。
(4)继续(2)(3)直至结束。
"""
def threeSum(nums):
res = []
nums.sort()
for i in range(len(nums) - 2):
if i == 0 or nums[i] != nums[i - 1]:
left, right = i + 1, len(nums) - 1
while left < right:
sums = nums[i] + nums[left] + nums[right]
if sums == 0:
res.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
while left < right and nums[left] == nums[left-1]:
left += 1
while left < right and nums[right] == nums[right+1]:
right -= 1
if sums > 0:
right -= 1
if sums < 0:
left += 1
return res
if __name__ == '__main__':
nums = [-1, 0, 1, 2, -1, -4]
result = threeSum(nums)
print(result)