目錄
題目: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...