Problem: 15. 三数之和
思路
你选用何种方法解题? 双指针
解题过程
需要注意: 1. 先进行排序 2. 如果和前面一个元素相同,就不用进入遍历
function threeSum(nums: number[]): number[][] {
// 排序
const res = [];
nums.sort((a,b)=> a-b);
// 问题转化 i+j+k=0 -> -i=j+k
for(let i = 0;i<nums.length;i++){
// 如果和上一个元素相同就跳出
if(i>0&&nums[i]==nums[i-1]) continue;
let target = -1*nums[i];
// 从i后面开始遍历
let l = i+1,r = nums.length-1;
// 把结果暂时放进这个数组里面
let ans = [];
// 双指针进行遍历
while(l<r){
// 计算sum和target进行比较
let sum = nums[l]+nums[r]
// 如果满足条件
if(sum==target){
ans = [nums[i],nums[l],nums[r]];
res.push(ans);
// 同时向中间移动
l++;
r--;
// 如果和上一个元素相同,就不需要重新计算比较了直接跳过
while(l<r&&nums[l]==nums[l-1]) l++;
while(l<r&&nums[r]==nums[r+1]) r--;
// 如果sum小了,左指针右移动
}else if(sum<target){
l++;
// 如果sum大了,右指针左移动
}else{
r--;
}
}
}
return res;
};