題目描述:
給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]
代碼實現:
- 很明顯這道題暴力法是行不通的,雖然沒嘗試,但是估計跑出來肯定會超時,暴力法時間複雜度應該是O(n^3),所以我們要儘可能嘗試一些能縮小時間複雜度的方法。
- 開始寫這道題確實沒什麼思路,但是首先肯定要排序,接着就可以使用指針法,一個指向首位,另一個指向第二位,第三個指向末尾,剩下的就是指針法的基本操作了。
- 寫這種題最重要的就是一定要在紙上畫,這樣就可以把每一步都看的比較明晰,另外本題中對於去重操作的代碼很多,在指針法中去重是必須考慮的一件事情,一定要注意,要把所有情況考慮周全。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var sum = []
nums.sort((a, b) => a - b)
if (nums === null || nums.length < 3) {
return sum
}
for (var i = 0; i < nums.length; i++ ) {
if (nums[i] > 0) {
break
}
if (i > 0 && nums[i] === nums[i - 1]) {
continue
}
var j = i + 1
var k = nums.length - 1
while (j < k) {
var add = nums[i] + nums[j] + nums[k]
if (add === 0 ) {
sum.push([nums[i], nums[j], nums[k]])
while (nums[j] === nums[j + 1]) {
j++
}
while (nums[k] === nums[k - 1]) {
k--
}
j++
k--
} else if (add > 0) {
k--
} else {
j++
}
}
}
return sum
};