給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。第一時間想到暴力演算法採用3重for迴圈,遍歷所有3個數的可能組合,找到和為0的,並且丟掉重複的組合即可。但是這樣複雜度過高o(n注意:答案中不可以包含重複的三元組。
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[[-1, 0, 1],
[-1, -1, 2]
]給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
3)
o(n^3)
o(n3
),沒有嘗試,應該會超時。
**了krahets的題解,加上自己的理解寫下這篇文章:先假定陣列第乙個數為3數和為0的其中乙個,然後在剩下的數中列舉所有2數組合,找其他兩個數,使得這3個數之和為0,如果找到記錄下結果,列舉完後假定陣列中下乙個數為3數和中的乙個,偽**如下:
idx1 = 0//假定nums[idx1]能與nums[idx2],nums[idx3]相加和為0如果這裡列舉所有2數組合採用兩重for迴圈,那麼上面的演算法仍然是o(nwhie (idx1< nums.size()-2) //這裡沒有考慮怎麼去重
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...