LeetCode C 刷題計畫 18 四數之和

2022-07-23 06:15:13 字數 2237 閱讀 6035

@author:csu張揚

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

category

difficulty

pass rate#br

algorithms

medium

36.01%

array / hash-table / two-pointers

linkedin

給定乙個包含 n

n 個整數的陣列nums和乙個目標值target,判斷nums中是否存在四個元素 aa,b

b,cc 和 d

d ,使得 a+b

+c+d

a+b+

c+d 的值與target相等?找出所有滿足條件且不重複的四元組。

注意:

答案中不可以包含重複的四元組。

示例:

給定陣列 nums =[1

,0,-

1,0,

-2,2

],和 target =

0。滿足要求的四元組集合為:[[

-1,0

,0,1

],[-

2,-1

,1,2

],[-

2,0,

0,2]

]

與前面三數之和類似,還是採用雙指標法,雙指標是用來選擇後兩個數的,因此前面還需要兩個迴圈,來選擇前兩個數。

需要注意的是這四個數,都需要進行去重處理。雙指標的去重我不再贅述,詳情參考 leetcode(c++)刷題計畫:15-三數之和。

下面我們講一下,前兩個數的去重**,以nums = [0, 0, 1, 1, 1, 2]為例。

首先第乙個數的去重**if (i > 0 && nums[i] == nums[i - 1]) continue;nums[i] == nums[i - 1]的作用就是判斷當前數是否和前乙個數相等。

i > 0,是為了防止第乙個數的nums[0] == nums[-1],這樣陣列就越界了。

第二個數的去重**if (k > i + 1 && nums[k] == nums[k - 1]) continue;nums[k] == nums[k - 1]的作用和前面一樣。

k > i + 1的目的倒不是防止越界,因為不可能越界。它主要為了防止過度去重。

舉個例子:nums = [0, 0, 1, 1, 1, 2]

i = 2時,nums[i] = 1。此時k = i + 1 = 3,nums[k] = 1

如果我們沒有k > i + 1這句,他會認為nums[k]是重複資料(因為nums[k] == nums[k - 1])。但是實際上是nums[k]nums[i](k = i + 1)在比較是否相等,然而這兩個數是可以相等的。

我們需要避免的是,在同乙個nums[i]下,連續的nums[k]不能相等,nums[i]不在我們的比較範圍內。

執行用時: 76 ms, 在所有 cpp 提交中擊敗了42.69%的使用者

記憶體消耗: 8.9 mb, 在所有 cpp 提交中擊敗了96.88%的使用者

class

solution);

while

(l < r && nums[l]

== nums[

++ l]

)while

(l < r && nums[r]

== nums[

--r ])}

else

if(sum < target)

else}}

}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 刷題計畫 15 三數之和

author csu張揚 email csuzhangyang gmail.com or csuzhangyang qq.com category difficulty pass rate br algorithms medium 24.31 array two pointers adobe ama...