LeetCode筆記題15 三數之和

2021-10-10 06:26:36 字數 2317 閱讀 8786

目錄

題目:1.暴力解法: t (n) = o(n3)  s(n)=o(n)

2.雙指標法:t (n) = o(n3)  s(n)=o(n)

3.**

給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

示例:給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[[-1, 0, 1],

[-1, -1, 2]

]遍歷每乙個元素i,拿到該元素i後再遍歷其後面元素j,拿到ij後再遍歷其後面元素k,判斷三個元素i+j+k=target ?,是則輸出i,j,k。

得到多個滿足條件的陣列,再用雜湊表去重,得到最終答案。

關鍵:需找出滿足的多個組合,但不能包含重複的組合

模式識別:遇到不能重複的要求時,想到先對給定數進行排序,再查詢

可以想到,固定滿足三數之和為0的第乙個數a之後,接下來就是找出剩餘數中的兩數,滿足兩數之和為-a,問題變為leetcode第一題twosum

與twosum不同的是,twosum只需要找到乙個解,而本題要求找到多個解,所以我們可以利用兩個指標移動來查詢:

nums = [-4, -1, -1, 0, 1, 2]

l              r

指向最小值的左指標l

指向最大值的右指標r

如果nums[l] +nums[r]  < 0 - (-4),說明和太小了,需要加大和,由於陣列本來已經從小到大排列,r已經是最大值了,所以得將l右移,使得兩數之和加大,

每移動一次再判斷一下

如果nums[l] + nums[r]  > 0 - (-4),說明和太大了,需要減小和,由於陣列本來已經從小到大排列,l已經是最小值了,所以得將r左移,使得兩數之和減小,

如果nums[l] + nums[r]  = 0 - (-4),說明和滿足要求,儲存當前值,由於不能重複,任何乙個l或r再保留的話下乙個值肯定會和剛才找到的重複,得lr都往下移動,繼續判斷,直至l=r,迴圈結束

時間複雜度:o(n^2),其中 n是陣列nums的長度。

空間複雜度:o(logn)。我們忽略儲存答案的空間,額外的排序的空間複雜度為 o(logn)。然而我們修改了輸入的陣列nums,在實際情況下不一定允許,因此也可以看成使用了乙個額外的陣列儲存了nums 的副本並進行排序,空間複雜度為 o(n)。

class solution(object):

def threesum(self, nums):

""":type nums: list[int]

:rtype: list[list[int]]

"""n = len(nums)

res =

if(not nums or n<3):

return res

nums.sort()

for i in range(n):

# 最小數都小於0,返回

if(nums[i]>0):

return res

# 目前固定的第乙個數和剛查完的第乙個數相同,後面查詢剩餘兩數肯定會重複,所以直接跳過

if i > 0 and nums[i] == nums[i-1] :

continue

l = i+1

r = n-1

# l=r時,查詢剩餘兩數的迴圈結束

while(l < r):

if nums[l] + nums[r] == 0 - nums[i] :

# 避免儲存重複陣列,如nums為[0,0,0,0,0]是的[[0,0,0,],[0,0,0]]

while ( l0):

r = r - 1

# 兩數之和小於差值,右移左指標,加大兩數之和

else:

l = l + 1

return res

執行結果:

通過執行用時:508 ms, 在所有 python 提交中擊敗了72.08%的使用者

記憶體消耗:18.5 mb, 在所有 python 提交中擊敗了15.25%的使用者

LeetCode刷題筆記 15 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 剪枝,left和ri...

LeetCode第15題 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 思路 首先想到的肯定...

leetcode刷題之路15 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 思路 先對vecto...