leetcode 15. 三数之和

js 复制代码
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    nums=nums.sort((a, b) => a-b);
    let len = nums.length
    // 如果长度不足3, 或者排序后最小值>0、或者最大值小于0, 不符合要求
    if(len<3 || nums[0]>0 || nums[len-1]<0) return [];
    if(nums[0]===0 && nums[len-1]===0) return [[0,0,0]]

    let res = []

    // 只有 numx[fixed]<=0,才可能出现答案
    for(let fixed=0; nums[fixed]<=0; fixed++){
        // 在比固定数字大的区域开启双指针
        let left = fixed+1, right = len-1;
        while(left < right){
            // 检验当前位置的三数之和是否满足题意
            let sum = nums[fixed] + nums[left] + nums[right]
            if(sum < 0){
                // 和 < 0, 则左指针指向的较小值增大, 
                left++
                // 同时注意跳过重复值
                while(left<right && nums[left]===nums[left-1]){
                    left++
                }
            }else if(sum > 0){
                // 和 > 0, 则右指针指向的较大值减小
                right--
                // 同时注意跳过重复值
                while(left<right && nums[right]===nums[right+1]){
                    right--
                }
            }else{
                // 满足条件
                res.push( [nums[fixed], nums[left], nums[right]] )
                // 先各走一步
                left++, right--
                // 若左指针当前数据和上一个数据相等, 则指针右移
                // 不能和下一个比较, 因为可能存在当 left===right+1时有nums[left]===nums[right]&&sum===0
                // 如果和方向相同的下一个比较,直接就把这种情况跳过了
                while(left<right && nums[left]===nums[left-1]){
                    left++
                }
                while(left<right && nums[right]===nums[right+1]){
                    right--
                }            
            }
        }
        // 一个nums[fixed]检验完毕后, 跳过重复的值
        while(nums[fixed] == nums[fixed+1]) fixed++
    }
    return res;
};
相关推荐
weixin_307779134 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
hetao17338379 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
福兮说9 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
Zootopia62610 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan10 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_9603563811 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
凤城老人11 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)11 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
h_a_o777oah11 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO911 小时前
指针的算术运算详解
java·数据结构·算法