@author:csu張揚category@email:[email protected] or [email protected]
difficulty
pass rate#br
algorithms
medium
24.31%
array / two-pointers
adobe / amazon / bloomberg / facebook / microsoft
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b
,c,a
,b,c
,使得 a+b
+c=0
a+b+
c=0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定陣列 nums =[-
1,0,
1,2,
-1,-
4],滿足要求的三元組集合為:[[
-1,0
,1],
[-1,
-1,2
]]
首先對陣列從大到小排序,陣列的大小為n
。
固定乙個數,從其右側的數中尋找另外兩個數。
假設我們固定的數為nums[k], k = 0 to n-1
, 另外兩個數初始時分別為nums[l], nums[r]
, 其中l = k + 1, r = n - 1
。
令sum = nums[k] + nums[l] + nums[r]
。
若sum < 0
,則我們要增大sum
,此時只能對l
向右挪一格,即:l ++
。
若sum > 0
,則我們要減小sum
,此時只能對r
向左挪一格,即:r --
。
若sum == 0
,此時這三個數就我們需要的數,將他們加入結果裡。此時,l
和r
之間的數還可能有我們需要的數,我們此時需要左右都向內移動,即:l ++, r --
。。
避免重複的資料。當sum == 0
時,我們需要l
和r
都向內移動。此時需要過濾掉和當前nums[l], nums[r]
重複的資料,我們巧妙的使用了兩個while迴圈,同時需注意l 要一直小於 r
。
while (l < r && nums[l] == nums[++ l])
while (l < r && nums[r] == nums[-- r])
同時,我們也要在k
的迴圈中過濾掉和當前nums[k]
重複的數字。這裡的k < len - 2
主要是防止陣列越界。
while (k < len - 2 && nums[k] == nums[++ k])
當l >= r
時,說明與當前固定的nums[k]
相組合的兩個數已經找完,所以要進入下乙個nums[k]
。
執行用時: 112 ms, 在所有 cpp 提交中擊敗了98.73%的使用者記憶體消耗: 14.6 mb, 在所有 cpp 提交中擊敗了86.17%的使用者
class
solution
sort
(nums.
begin()
, nums.
end())
;int k =0;
while
(k < len -
2&& nums[k]
<=0)
);while
(l < r && nums[l]
== nums[
++ l]
)while
(l < r && nums[r]
== nums[
-- r])}
else
if(sum <0)
else
}while
(k < len -
2&& nums[k]
== nums[
++ k])}
return res;}}
;
LeetCode C 刷題計畫 27 移除元素
author csu張揚 email csuzhangyang gmail.com or csuzhangyang qq.com category difficulty pass rate br algorithms easy 56.32 array two pointers unknown 給定乙...
LeetCode C 刷題計畫 7 整數反轉
author csu張揚 email csuzhangyang gmail.com or csuzhangyang qq.com 給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123輸出 321示例 2 輸入 123 輸出 321示例 3 輸入 120輸出 ...
LeetCode C 刷題計畫 18 四數之和
author csu張揚 email csuzhangyang gmail.com or csuzhangyang qq.com category difficulty pass rate br algorithms medium 36.01 array hash table two pointer...