题目描述
题目思路:
- 将数组从小到大排序
- 从第一个数开始遍历
- 当该数大于0,说明相加起来肯定不会=0,结束遍历
- 当该数等于前一个数,continue
- 剩下两个数定义为right(最右的数),left(该数的下一个数),然后将三个数进行相加,当>0的时候,right–,当<0的时候,++
- 记得去重
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
if(nums.length < 3) return []
nums.sort((a,b)=>{
return a-b
})
let n = []
let length = nums.length
for(let i = 0; i<length;i++){
if(nums[i]>0) break
if(i>0&&nums[i]==nums[i-1]) continue
let L = i+1
let R = length-1
while(L<R){
const sum = nums[i]+nums[L]+nums[R]
if(sum === 0){
n.push([nums[i],nums[L],nums[R]])
while(L<R&&nums[L] == nums[L+1]) L++//去重
while(L<R&&nums[R] == nums[R-1]) R--//去重
L++
R--
}
else if(sum<0){
L++
}
else if(sum>0){
R--
}
}
}
return n
};