給定一個包含 n 個整數的列表 nums,請判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重復的三元組。
注意:答案中不可以包含重復的三元組。
例如:
給定一個列表:[-1, 0, 1, 2, -1, -4]
返回結果:[(-1, -1, 2), (-1, 0, 1)]
給定一個列表:[1, 2, 4]
返回結果:[]
給定一個列表:[-1, 0, 1, 2, -1, -4, 0, 2, 0, 4, -4, -2, -1, 2]
返回結果:[(-4, 0, 4), (-4, 2, 2), (-2, 0, 2), (-1, -1, 2), (-1, 0, 1), (0, 0, 0)]
代碼實現1
def threeSum(nums):
res = []
nums.sort() # 排序
for i in range(len(nums)):
if nums[i] > 0: # 排序後,如果第一個數 a 大於 0 ,那麼必然不存在符合條件的三元組
break
if i > 0 and nums[i] == nums[i - 1]: # 第一個數 a 去重
continue
tmp_set = set()
for j in range(i + 1, len(nums)):
# 從 j > i + 2 考慮,是因為允許有2種特殊情況: (1) a = b = c = 0; (2) a為負數,b = c 且 a + b + c = 0
if j > i + 2 and nums[j] == nums[j - 1] and nums[j] == nums[j - 2]: # 第二個數 b 去重
continue
a, b, c = nums[i], nums[j], 0 - nums[i] - nums[j]
if c in tmp_set:
res.append((a, b, c))
tmp_set.remove(c) # 第三個數 c 去重
else:
tmp_set.add(nums[j])
return res
代碼實現2
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441 尋找有志同道合的小伙伴,互幫互助,群裡還有不錯的視頻學習教程和PDF電子書! '''
def threeSum(nums):
res = []
nums.sort() # 排序
for i in range(len(nums)):
if nums[i] > 0: # 排序後,如果第一個數 a 大於 0 ,那麼必然不存在符合條件的三元組
break
if i > 0 and nums[i] == nums[i - 1]: # 第一個數 a 去重
continue
left, right = i + 1, len(nums) - 1
while left < right:
a, b, c = nums[i], nums[left], nums[right]
if a + b + c < 0: # nums是排好序的,此時小於0,那麼需要讓 b 增加,left向右移動
left += 1
elif a + b + c > 0: # nums是排好序的,此時大於0,那麼需要讓 c 減小,right向左移動
right -= 1
else:
res.append((a, b, c))
# a 在外層循環固定保持不變,所以找到一組符合條件的 b 和 c 後,left、right都需要移動
left += 1 # left向右移動
right -= 1 # right向左移動
while left < right and nums[left - 1] == nums[left]: # 第二個數 b 去重
left += 1
while left < right and nums[right] == nums[right + 1]: # 第三個數 c 去重
right -= 1
return res