力扣学习算法六

137 阅读1分钟

15. 三数之和

本题首先你要进行排序,这样方便你前后找然后进行相加;这里用map的键进行存储防止重复的值产生

    var result = {};//这里用map的键进行存储防止重复的值产生
    nums.sort((a, b) => a - b);//从小到大排序
    for (let i = 0; i < nums.length; i++) {//然后多整个数组进行循环
        let L = i + 1;//这里是要找值左侧的指针   这里为什么是i+1而不是从0开始呢,这里在i前面的你已经找过了不需要在找一遍了所以从当前后面的位置开找就可以
        let R = nums.length - 1;//右侧的指针
        while (L < R) {
            var num = nums[i] + nums[L] + nums[R]
            if (num === 0) {
                result[nums[i] + "," + nums[L] + "," + nums[R]] = true//这里就是存上键
                L++;
                R--;
            }
            if (num < 0) L++;//因为咱们是从小到大排序当前的值要是小于0说明你要把左指针往右移让左侧的数变大,(因为这时候右侧的值已经是最大了不能在大了)
            if (num > 0) R--;//和L(左侧的指针相对道理相同)
        }
    }
    //这里就是把key变成题目要求的格式
    return Object.keys(result).map(item => item.split(",").map(it => Number(it)));
};