JS leetcode15. 三数之和

这篇博客介绍了如何通过排序和双指针技术解决寻找数组中和为0的不重复三元组的问题。首先对数组进行升序排序,然后固定一个值,使用两个指针分别从其右侧开始寻找两个数,使得三数之和为0。当找到符合条件的三元组时,记录并避免重复。如果和小于0,移动较小值指针;如果和大于0,移动较大值指针。最后返回所有找到的不重复三元组。
摘要由CSDN通过智能技术生成

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

解题思路:
先将数组进行排序
从左侧开始,选定一个值为 定值 ,右侧进行求解,获取与其相加为 00 的两个值
类似于快排,定义首和尾
首尾与 定值 相加
等于 00,记录这三个值
小于 00,首部右移
大于 00,尾部左移
定值右移,重复该步骤

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    var res = [];
    nums.sort((a, b) => a - b);
    // 先从小到大进行排序,最左侧为定值,右侧所有值进行两边推进计算
    var size = nums.length;
    if (nums[0] <= 0 && nums[size-1] >= 0) {
        // 保证有正负数
        var i = 0;
        while (i < size - 2) {
            if (nums[i] > 0) break; // 最左侧大于0,无解
            var first = i + 1;
            var last = size - 1;
            while (first < last) {
                if (nums[i] * nums[last] > 0) break; //三数同符号,无解
                var sum = nums[i] + nums[first] + nums[last];
                if (sum == 0) {
                    res.push([nums[i], nums[first], nums[last]]);
                }
                if (sum < 0) {
                    // 负数过小,first右移
                    while (nums[first] === nums[++first]) {} //重复值跳过
                } else {
                    while (nums[last] === nums [--last]) {}
                }
            }
            while (nums[i] === nums[++i]) {}
        }
    }
    return res;

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值