给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
主要思路是:通过先确定最左边的元素,之后就成为了tow Sum的问题了,关于Tow Sum,我们可以使用双指法去确定元素的位置
注意:
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort() # 进行排序
res, k = [], 0
for k in range(len(nums) - 2): # 开始确定第一个元素位置
if nums[k] > 0: break # 1. because of j > i > k.
if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.
i, j = k + 1, len(nums) - 1
while i < j: # 3. double pointer
s = nums[k] + nums[i] + nums[j]
if s < 0:
i += 1
while i < j and nums[i] == nums[i - 1]: i += 1 # 跳过相同的
elif s > 0:
j -= 1
while i < j and nums[j] == nums[j + 1]: j -= 1 # 跳过相同的
else:
res.append([nums[k], nums[i], nums[j]])
i += 1
j -= 1
while i < j and nums[i] == nums[i - 1]: i += 1# 跳过相同的
while i < j and nums[j] == nums[j + 1]: j -= 1# 跳过相同的
return res
将数组分为三块。第一块全为负数,第二块全是0,第三块全为正数。
我尝试将中间一块取最小的非负数的,但是程序实现很复杂。
class Solution(object):
def function(self,left,right):
ret =[]
if len(left) > 1 and len(right)>0:
for i in range(len(left)-1):
for j in range(i+1,len(left)):
temp = -1*(left[i]+left[j])
if temp in right:
min_val = min(left[i],temp,left[j])
max_val = max(left[i],temp,left[j])
ret.append([min_val,0-min_val-max_val,max_val ])
return ret
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
ret=[]
left=[]
right=[]
mid=[]
for i in range(len(nums)):
if nums[i] < 0:
left.append(nums[i])
elif nums[i] >0:
right.append(nums[i])
else:
mid.append(nums[i])
if len(left) > 0 and len(mid) and len(right) > 0: # 左右两边各自取一个
if len(left) < len(right):
temp = left
else:
temp =right
for i in range(len(temp)):
if i+1 < len(temp) and temp[i] == temp[i+1]:
continue
if -1*temp[i] in nums:
ret.append([min(temp[i],-temp[i]), 0 , max(temp[i],-temp[i])])
ret = ret + self.function(left,right) + self.function(right,left)
if len(mid) >2:
ret.append([0,0,0])
result =[]
for item in ret:
if item not in result:
result.append(item)
return result
最后超出时间限制了。