三數之和為0(leetcode 15)

2021-09-24 10:44:18 字數 1890 閱讀 7062

給定乙個包含 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 因為這次是要求輸出對應的三...