LeetCode C 刷題計畫 15 三數之和

2022-07-23 06:18:19 字數 2436 閱讀 2173

@author:csu張揚

@email:[email protected] or [email protected]

category

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,此時這三個數就我們需要的數,將他們加入結果裡。此時,lr之間的數還可能有我們需要的數,我們此時需要左右都向內移動,即:l ++, r --。。

避免重複的資料。sum == 0時,我們需要lr都向內移動。此時需要過濾掉和當前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...