給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[ [-1, 0, 1],
[-1, -1, 2]
]
先對陣列進行排序
以i
為陣列首,j
為陣列尾,在i
與j
直接尋找k能使得nums[i] + nums[j] + nums[k] == 0
。當k
從i
走到j
時,說明中間已經遍歷完了,然後令i
右移一位,j
重新回到陣列尾部,繼續尋找k
。
if
(i >
0&& nums[i]
== nums[i -1]
)continue
;
注意,是nums[i] != nums[i - 1]
,不是nums[i] != nums[i + 1]
,如果是nums[i] == nums[i - 1],在上乙個迴圈中就已經取到了所有情況;如果是nums[i] == nums[i + 1]就跳出,那麼nums[i]和nums[k]就不能取到相同的值。
同樣注意
if
(i >
0&& nums[i]
== nums[i -1]
)continue
;
與
while
(i >
0&& nums[i]
== nums[i -1]
) i++
;
不同,前者進行一次for迴圈的界限判斷。
每當有nums[i] + nums[j] + nums[k] == 0
成立,k就要往右移一位。要保證k不能移動到相同的值,如陣列[0,0,0,0],k初始為1,得到乙個結果[0,0,0],k右移一位,nums[k]還是為0,又得到乙個結果[0,0,0]。所以k移動過程中,nums[k] != nums[k-1]
。**如下:
do
while
(k < j && nums[k]
== nums[k-1]
);
class
solution
while
(k < j && nums[k]
== nums[k-1]
);}else
if(nums[i]
+ nums[j]
+ nums[k]
<0)
else}}
return result;
}}
15 三數之和
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 最首先想到的是來三層...
15 三數之和
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。有兩種寫法 第一種耗時久,但容易解讀 class solution if nums.length 3 else if ...
15 三數之和
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 分析排序 雙指標避免...