LeetCode_15. 3Sum 求3个数字之和为0的所有情况的组合

题目:

Given an array nums of n integers, are there elements abc 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)       #最后将集合变成列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值