Leetcode15 三數之和(雙指標)

2021-10-01 07:32:56 字數 2164 閱讀 2210

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

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

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

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

[[-1, 0, 1],

[-1, -1, 2]

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

第一時間想到暴力演算法採用3重for迴圈,遍歷所有3個數的可能組合,找到和為0的,並且丟掉重複的組合即可。但是這樣複雜度過高o(n

3)

o(n^3)

o(n3

),沒有嘗試,應該會超時。

**了krahets的題解,加上自己的理解寫下這篇文章:先假定陣列第乙個數為3數和為0的其中乙個,然後在剩下的數中列舉所有2數組合,找其他兩個數,使得這3個數之和為0,如果找到記錄下結果,列舉完後假定陣列中下乙個數為3數和中的乙個,偽**如下:

idx1 = 0//假定nums[idx1]能與nums[idx2],nums[idx3]相加和為0

whie (idx1< nums.size()-2) //這裡沒有考慮怎麼去重

如果這裡列舉所有2數組合採用兩重for迴圈,那麼上面的演算法仍然是o(n

3)

o(n^3)

o(n3

),但是可以利用雙指標代替兩重for迴圈,用雙指標列舉時間複雜度為o(n)

具體的思路如下,要想使用雙指標,先對nums陣列進行排序(從小到大),時間複雜度為o(nlogn),設定3個指標,idx1,idx2,idx3,idx1初始指向陣列的起始位置idx1=0,idx2=idx+1,idx3=nums.size()-1,現在目標變為在陣列nums[idx2-idx3]中到兩個數,使得nums[idx1]+nums[idx2]+nums[idx3] = 0。

設sum = nums[idx1] + nums[idx2] + nums[idx3],如果sum<0,那麼只有將其中乙個數增大才有可能使得sum=0,因為nums陣列是有序的,只需要將idx2++即可,因為nums[idx2] <= nums[idx2+1],增加nums[idx2]的值才有可能使得sum從小於0轉變為等於0。另一種情況,如果sum>0,這時只有讓idx3–才有可能使sum從大於0轉變為等於0。最後如果sum=0,則記錄nums[idx1],nums[idx2],nums[idx3]到結果中,同時,idx2++,idx3–,此時必須讓idx2和idx3跳過相同的元素直至乙個新的元素,不然找到的結果會有重複的。當idx2==idx3時上述列舉過程結束,idx1++(此時同樣需要跳過與nums[idx1]相同的元素,不然會有重複結果),idx2=idx1+1,idx3=nums.size()-1,開啟下一輪列舉,上述演算法時間複雜度為o(n

2)

o(n^2)

o(n2

)

class solution 

if(sum <0)

if(sum ==0)

);idx2++

;while

(idx2 < idx3 && nums[idx2]

== nums[idx2-1]

) idx2++

;//跳過所有相同的元素,如果不跳過得到的結果中有相同的

idx3--

;while

(idx2 < idx3 && nums[idx3]

== nums[idx3+1]

) idx3--

;//跳過所有相同的元素,如果不跳過得到的結果中有相同的}}

idx1++

;while

(idx1 < nums.

size()

-2&& nums[idx1]

== nums[idx1-1]

) idx1++

;//跳過所有相同的元素,如果不跳過得到的結果中有相同的

}return rst;}}

;

leetcode15 三數之和 雙指標

給定乙個包含 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 三數之和

15.給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組 方法一,個人解法正確,但是效率太低,時間複雜度o n 3 時間超時,無法提交至leetcode public s...

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 class solutio...