题目:
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] ]
代码:
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ans = set([]) #结果用集合存储,且数字都是按从小到大排序存入的,故可以排除重复的情况
plus = sorted([n for n in nums if n>0]) #大于0的数字排序,排序的目的在于可以按照一定规律存储这三个数字,然后集合可以排除重复的情况
plus_c = set(plus) #去掉重复的数字,目的在于查找的时候可以节省很多时间
zero = [n for n in nums if n == 0] #所有的0放在一起
minus = sorted([n for n in nums if n<0]) #小于0的数字排序
minus_c = set(minus) #去掉重复的数字
# all zero #考虑三个0的情况
if len(zero)>2:
ans.add((0,0,0))
# plus zero minus #考虑一个0的情况
if len(zero)>0:
for n in minus:
if -n in plus_c:
ans.add((n,0,-n))
# plus minus minus
n = len(minus) #考虑两个负数一个正数的情况
for i in range(n):
for j in range(i+1,n):
diff = -(minus[i]+minus[j])
if diff in plus_c:
ans.add((minus[i],minus[j],diff))
# plus plus minus
n = len(plus) #考虑两个正数一个负数的情况
for i in range(n):
for j in range(i+1,n):
diff = -(plus[i]+plus[j])
if diff in minus_c:
ans.add((diff,plus[i],plus[j]))
return list(ans) #最后将集合变成列表