15.三数之和

15. 三数之和

难度中等1904收藏分享切换为英文关注反馈

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
#暴力法
def threeSum(nums):
    results = []
    if not nums:
        return None
    from collections import Counter
    vocab = Counter(nums)
    for i in range(len(nums)):
        vocab = Counter(nums)
        for j in range(i):
            vocab[nums[i]] -= 1
            vocab[nums[j]] -= 1
            
            if -(nums[i]+nums[j]) in vocab and vocab[-(nums[i]+nums[j])]>0:
                results.append([nums[i],nums[j],-nums[i]-nums[j]])
    return results
#排序,双指针
def threeSum(nums):
    results = []
    if not nums or len(nums)<3:
        return []
    
    nums.sort()
    for i in range(n):
        if(nums[i]>0):#数组已经排序,大于0之后不会有三数和为0
            return results
        if(i>0 and nums[i]==nums[i-1]):#去重,i-1位置符合要求的数组已经统计过,i位置和i-1数值相等,得到的结果也是重复
            continue
        L=i+1
        R=n-1
        while(L<R):
            if(nums[i]+nums[L]+nums[R]==0):
                result.append([nums[i],nums[L],nums[R]])
                while(L<R and nums[L]==nums[L+1]):#去重,i已经指定,如果L和L+1位置相等,那R位置肯定也相等,得到的结果就会重复
                    L=L+1
                while(L<R and nums[R]==nums[R-1]):#去重,同上
                    R=R-1
                L=L+1
                R=R-1
            elif(nums[i]+nums[L]+nums[R]>0):
                R=R-1
            else:
                L=L+1
    return res
posted @ 2020-03-18 16:41  鱼与鱼  阅读(122)  评论(0编辑  收藏  举报