15 三數之和

2021-09-01 20:13:23 字數 1171 閱讀 4036

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[ [-1, 0, 1],

[-1, -1, 2]

]

最首先想到的是來三層循壞,然後將和為0的三個變數加入集合即可。

**如下:

public static list> threesum(int nums) }}

}}

return alllist;

}

通過上面的**我們可知,該方法雖然很簡單明瞭,但是時間複雜度卻太高了,提交後會超時的。

由a+b+c = 0得,我們只需要確定兩個變數a、b,然後再尋找是否存在c即可,這樣我們就只需要兩層循壞了。在尋找c的過程中,我們可以使用2分法,所有需要對陣列進行排序。如果排序後陣列中最小的那個數大於0或者最大的那個數小於0、或者陣列中最多有2個元素,那麼直接返回空的集合即可。

public static list> threesum2(int nums) else 

//判斷是否重複

if(!alllist.contains(list)) }}

}}

return alllist;

}

上面的**較第一段的時間複雜度有所下降,但是當確定1個變數的值後,還需要遍歷後面的值來確定第2個變數,以此來確定第三個變數的值,這樣還是會超時的,仍然不能夠滿足我們的需求。

因為a + b + c = 0,targe = 0 - a;所以 b + c = targe。我們可以用兩個指標指向陣列剩餘部分的首尾,開始遍歷,這樣就比從頭遍歷到尾的時間更低,**如下:

public static list> threesum(int nums) else if(nums[j] + nums[k] < -nums[i])else}}

}return alllist;

}

通過上面的**,我們也不需要進行集合是否重複,因為所有重複的集合都已經被我們過濾了。

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 分析排序 雙指標避免...

15 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 定義兩個指標,分別指...