@author:csu張揚category@email:[email protected] or [email protected]
difficulty
pass rate#br
algorithms
medium
36.01%
array / hash-table / two-pointers
給定乙個包含 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...