15.三数之和,使用双指针
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
let length = nums.length;
let res=[];
// 排序
nums.sort((a,b)=>a-b);
for(let i=0;i<length-2;i++){
// 处理数组中相邻两个元素重复的问题
if (i>0 && nums[i]==nums[i-1]){
continue;
}
// 使用双指针,寻找两个元素之和等于-nums[i]
let target=-nums[i];
let left = i+1;
let right = length-1;
if(nums[i]>0)break;
while(left<right){
let sum=nums[left]+nums[right];
// 1.符合要求的情况
if (sum==target){
// 找到的第一种结果
res.push([nums[i],nums[left],nums[right]]);
// 注意数组res里面放着很多个数组
// 接着便利双指针,处理元素重复的问题
while(left<right && nums[left]==nums[left+1]){
left++;
}
while(left<right && nums[right]===nums[right-1]){
right--;
}
left++;
right--;
}
// 2.sum<target
else if(sum<target){
left++;
}
// 3.sum>target
else{
right --;
}
}
}
return res;
};