演算法題解4 三數之和

2021-10-23 13:17:06 字數 1309 閱讀 4194

tags:

- 三層迴圈

- 雙指標

給定乙個包含 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: list[int]):

answer =

nums.sort()

for x in range(len(nums)):

for y in range(x+1,len(nums)):

for z in range(y+1,len(nums)):

if nums[x]+nums[y]+nums[z] == 0:

temp=[nums[x],nums[y],nums[z]]

if temp not in answer:

return answer

測試簡單用例可以通過,但是提交時顯示超過時間限制。於是去翻題解大佬們的解法,記錄如下。

def threesum(nums: list[int]):

ans= #用來儲存結果的列表

if(not nums or len(nums)<3): #排除列表為空或元素數小於3的特例

return

nums.sort() #有小到大排序方便後續的判斷

for i in range(len(nums)):

if(nums[i]>0): #如果最小的i大於0,那麼肯定無法找到滿足條件的結果

return ans

if(i>0 and nums[i]==nums[i-1]): #如果當前元素與上個元素相同,則結果肯定重複,可以跳過

continue

l=i+1 #設定左指標

r=len(nums)-1 #設定右指標

while(l0): #當結果大於0時,說明右指標元素過大,移動右指標

r=r-1

else: #當結果小於0時,說明左指標元素過小,移動左指標

l=l+1

return ans

解法是借鑑題解中的大佬寫得,注釋由個人理解所寫。

三數之和題解

三數之和題解 感謝大神的解答,受益匪淺,對面試和思考演算法有了新的認識,找到了其中的樂趣 三數之和題解 仔細思索,發現雙指標的妙處所在 因為對於有序的序列的話,我從兩頭開始往中間走,如果變大,我可以左指標加一,如果變小,我可以右指標減一 而且我可以取到最大值和最小值,這樣類似乙個有界區間一樣,我可以...

演算法 兩數之和,三數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 leetcode 思路 兩層for迴圈時間複雜度是o ...

4數之和為0(題解)

題意 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。思路 1.暴力列舉o n 4 2.兩兩枚舉o n 2 利用桶排 3.兩兩分組,一組求和排序 ...