15 三數之和

2021-09-29 08:23:07 字數 1587 閱讀 3358

給定乙個包含 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為陣列尾,在ij直接尋找k能使得nums[i] + nums[j] + nums[k] == 0。當ki走到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 分析排序 雙指標避免...