【力扣hot100】三数之和 - 双指针

22 阅读1分钟

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;
};