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