Loading

Leetcode - 15. 三数之和

给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0 ?请你找出所有和为0且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解1 2021/8/29 O(n2)

from collections import defaultdict

def threeSum(nums: list) -> list:
    # 简单情况处理
    len=nums.__len__()
    if len<=2: return []
    if len==3: return [] if sum(nums) != 0 else [nums]

    # 降规模
    # 排序后,存到字典,O(logn) + O(n)
    nums.sort()
    # print(nums)
    d=defaultdict(int)
    for x in nums:
        d[x]+=1
    # O(n^2)遍历
    res=list()
    for x in d.keys():
        for y in d.keys():
            if y<x or (y==x and d[y]<=1): continue
            left=-(x+y)
            # 避免答案的排列组合,[x,y,left]一定是递增的
            if left<y: continue
            if d.get(left):
                if left==x or left==y:
                    if (x!=y) and ((left==x and d[x]>=2) or (left==y and d[y]>=2)):
                        res.append([x, y, left])
                    elif x==y and d[x]>=3:
                        res.append([x, y, left])
                else:
                    res.append([x, y, left])
    return res

if __name__ == '__main__':
    print(threeSum([-1,0,1]))
    print(threeSum([-1,2,-1]))
    print(threeSum([-1,0,1,2,-1,-4]))
    print(threeSum([]))
    print(threeSum([0]))

posted @ 2021-08-28 22:12  wwcg2235  阅读(27)  评论(0)    收藏  举报