給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c , 使得 a + b + c = 0 ?
找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:[ [-1, 0, 1], [-1, -1, 2]]
解題思路
講解1:首先安排所有人按照順序排隊站好,這是乙個需要花時間的操作,不過磨刀不誤砍柴工,付出這個時間
還是值得的。排序可以做到 o(nlogn),這是優於o(n2)的。然後我們選擇乙個人做c位,既然是c位,那麼就需要
左右各有乙個人。先選擇隊伍最左邊(最小值)和隊伍最右邊(最大值)兩個人,加上你,算一下總和。
如果大於0,說明實力太強了,就把就把右側的人選調左一位,反之,則調整左邊的人選,增強一下實力。當某邊
選到緊挨著你的人的時候,就意味著組隊結束,以你為 c位的所有可能都已經嘗試完畢了。
講解2:首先對陣列從小到大排序,從乙個數開始遍歷,若該數大於0,後面的數不可能與其相加和為0,所以跳過;
否則該數可能是滿足要求的第乙個數,這樣可以轉化為求後面陣列中兩數之和為該數的相反數的問題。
定義兩個指標一前一後,若找到兩數之和滿足條件則加入到解集中;若大於和則後指標向前移動,反之則前指標
向後移動,直到前指標大於等於後指標。這樣遍歷第乙個數直到陣列的倒數第3位。注意再求和過程中首先判斷
該數字是否與前面數字重複,保證解集中沒有重複解
class solution(object):
def threesum(self, nums):
""":type nums: list[int]
:rtype: list[list[int]]
"""# 儲存結果列表
res_list =
# 對nums列表進行排序,無返回值,排序直接改變nums順序
nums.sort()
for i in range(len(nums)):
# 如果排序後第乙個數都大於0,則跳出迴圈,不可能有為0的三數之和
if nums[i] > 0:
break
# 排序後相鄰兩數如果相等,則跳出當前迴圈繼續下一次迴圈,相同的數隻需要計算一次
if i > 0 and nums[i] == nums[i-1]:
continue
# 記錄i的下乙個位置
j = i + 1
# 最後乙個元素的位置
k = len(nums) - 1
while j < k:
# 判斷三數之和是否為0
if nums[j] + nums[k] == -nums[i]:
# 把結果加入陣列中
# 判斷j相鄰元素是否相等,有的話跳過這個
while j < k and nums[j] == nums[j+1]: j += 1
# 判斷後面k的相鄰元素是否相等,是的話跳過
while j < k and nums[k] == nums[k-1]: k -= 1
# 沒有相等則j+1,k-1,縮小範圍
j += 1
k -= 1
# 小於-nums[i]的話還能往後取
elif nums[j] + nums[k] +nums[i]<0 :
j += 1
else:
k -= 1
return res_list
a,target=[-4,3,1,2,-1,-4],0
s=solution()
print(s.threesum(a))
leetcode 三數之和為0
題目描述 給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 具體思路 ...
4數之和為0(題解)
題意 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。思路 1.暴力列舉o n 4 2.兩兩枚舉o n 2 利用桶排 3.兩兩分組,一組求和排序 ...
leetcode 三數之和
給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 因為這次是要求輸出對應的三...