思路:
1.先排序
2.首先判断nums数组长度,如果小于3 或者 升序排序后第一个元素大于0 则直接返回空数组
3.left必须小于right
4.三数之和等于0就push,小于0就start++,大于0就end--
4.判断left++和right--是不是一样,一样就继续++和--
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function (nums) {
// 采用双指针方法
// 1、首先判断nums数组长度,如果小于3 或者 升序排序后第一个元素大于0 则直接返回空数组
let res = []
nums.sort((a, b) => a - b)
if (nums.length < 3 || nums[0] > 0) return res
// 2、对nums数组进行for循环
for (let i = 0; i < nums.length; i++) {
// 3、对连续相同的元素去重 (第一个元素不执行)
if (i > 0 && nums[i] === nums[i - 1]) continue
// 4、定义左指针
let Left = i + 1
// 5、定义右指针
let Right = nums.length - 1
// 6、指定当前元素为a 进行while循环判断b和c 条件是Left 小于 Right 由两边向中间夹
while (Left < Right) {
let num = nums[i] + nums[Left] + nums[Right]
// 7、如果num 三数之和等于0 则push到结果数组res中,并且要再判断下一元素是否与当前元素相同
if (num === 0) {
res.push([nums[i], nums[Left], nums[Right]])
// 8、对左指针的下一元素 也就是左指针右边的元素 进行去重处理
while (Left < Right && nums[Left] === nums[Left + 1]) Left++
// 9、对右指针的下一元素 也就是右指针左边的元素 进行去重处理
while (Left < Right && nums[Right] === nums[Right - 1]) Right--
// 10、如果没有左右都没有重复 则左边指针向右移动一个 右边指针向左移动一个
Left++
Right--
}
// 11、如果num 三数之和小于0 则左指针向右移动一个
else if (num < 0) {
Left++
}
// 12、如果num 三数之和大于0 则右指针向左移动一个
else if (num > 0) {
Right--
}
}
}
// 13、执行完循环,最后返回结果数组 res
return res
}