题目:
代码:
/*
* [15] 三数之和
* 1、排序
* 2、当前作为第一个数,分别选取右边的第一个和最后一个进行计算,等于0,把值放入result
* 3、判断nums[i]是否与左侧的数相等,相等则跳过
* 4、判断nums[i]是否已经大于0,是则结束整个循环
* 5、在循环取numL和numR时,如果numL和他左边的数相等或numR和他右边的数相等,则是重复答案
*/
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
nums = nums.sort( (a, b) => { return a-b })
let result = [];
for (let i = 0; i < nums.length; i++){
let num = nums[i];
if (num > 0) {
break;
}
if (i > 0 && num === nums[i-1]) {
continue;
}
let left = i + 1;
let right = nums.length - 1;
while ( left < right) {
let numL = nums[left];
let numR = nums[right];
if (left > i +1 && numL === nums[left-1]){
left ++;
} else if (right < nums.length - 1 && numR === nums[right +1]) {
right --;
} else {
let sum = num + numL + numR;
if (sum === 0) {
result.push([num, numL, numR]);
left ++;
} else if (sum > 0) {
right --;
} else if (sum < 0) {
left ++;
}
}
}
}
return result;
};