給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定陣列 nums = [-1, 0, 1, 2, -1, -4],首先,對原陣列進行排序,遍歷排序後的陣列,需要注意不是遍歷到最後乙個停止,而是到倒數第三個就可以;滿足要求的三元組集合為:
[[-1, 0, 1],
[-1, -1, 2]
]
其次,可以做個剪枝優化,即遍歷到正數的時候就break
,因為陣列現在是有序的,如果第乙個要 fix 的數就是正數了,則後面的數字就都是正數,就永遠不會出現和為0的情況;
然後,還要加上重複就跳過的處理,處理方法是從第二個數開始,如果和前面的數字相等,就跳過,因為不想把相同的數字fix兩次;
再次,對於遍歷到的數,用0減去這個 fix 的數得到乙個target
,然後只需要在之後找到兩個數之和等於target
即可;
最後,用兩個指標分別指向 fix 數字之後的陣列的首尾兩個數,如果兩個數和正好為target
,則將這兩個數和 fix 的數一起存入結果中。然後就是跳過重複數字的步驟,兩個指標都需要檢測重複數字。如果兩數之和小於target
,則將左邊那個指標i右移一位,使得指向的數字增大一些。同理,如果兩數之和大於target
,則將右邊那個指標j左移一位,使得指向的數字減小一些。
class
solution
;for
(int k =
0; k <
(int
)nums.
size()
-2;++k));
while
(i < j && nums[i]
== nums[i +1]
)++i;
while
(j < j && nums[j]
== nums[j -1]
)--j;
++i;
--j;
}else
if(nums[i]
+ nums[j]
< target)
else}}
return res;}}
;
LeetCode 0015 三數之和
給定乙個包含n個整數的陣列 nums,判斷nums中是否存在三個元素a,b,c,使得a b c 0?找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 排序 雙指標。首先對原陣列進行排...
學渣帶你刷Leetcode0015 三數之和
給你乙個包含 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三數之和Golang
題目的要求有兩個,首先是三個數的和為0,其次是這種和為0的三元組不能重複。當給定乙個陣列,我們求滿足和為0的三元組的時候核心思想使用的是暴力破解,也就是三重迴圈,遍歷三次陣列,但是在這裡我們給出如下優化 首先將陣列按照從小到大的順序排序 設定三個指標index,分別為i,j,k,他們分別代表陣列中滿...