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]))


浙公网安备 33010602011771号