力扣第16题-最接近的三数之和(JavaScript语言)

本篇博客主要介绍LeetCode第16题的解决方案,使用JavaScript语言实现。思路是通过排序配合双指针法找出最接近的三数之和。文中分别提供了带和不带重复元素处理的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路(排序+双指针法)

(与上一题有点相似,借助上一题的思路)
这题其实可以不用去重,就能求得。
(我先不用去重做的。想试试去重,结果又是各种坑)

代码

没有考虑元素去重的代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
    nums = nums.sort((a, b) => a - b);
    var res;
    var abs = Number.MAX_VALUE;
    for (let i = 0; i < nums.length; i++) {
        let left = i + 1;
        let right = nums.length - 1;
        while (left < right) {
            if (Math.abs(target - nums[i] - nums[left] - nums[right]) < abs) {
                abs = Math.abs(target - nums[i] - nums[left] - nums[right]);
                res = nums[i] + nums[left] + nums[right];
            }
            if (target - nums[i] == nums[left] + nums[right]) return res;
            else if (target - nums[i] > nums[left] + nums[right]) left++;
            else if (target - nums[i] < nums[left] + nums[right]) right--;

        }
    }
    return res;
};

考虑元素去重的代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
    nums = nums.sort((a, b) => a - b);
    var res;//返回值
    var abs = Number.MAX_VALUE;//abs(target-三数之后)
    for (let i = 0; i < nums.length-2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
        }
        let left = i + 1;
        let right = nums.length - 1;
        while (left < right) {
            if (Math.abs(target - nums[i] - nums[left] - nums[right]) < abs) {//看(target-三数之后)的绝对值是不是更小了,是的话更替
                abs = Math.abs(target - nums[i] - nums[left] - nums[right]);
                res = nums[i] + nums[left] + nums[right];
                
            }
            if (target - nums[i] == nums[left] + nums[right]) return res;
            else if (target - nums[i] > nums[left] + nums[right]) {
                left++;
                while(left < right && nums[left] == nums[left - 1]) left++;//第二个数去重(不去重也可以,增加效率)
                
            }
            else if (target - nums[i] < nums[left] + nums[right]) {
                right--;
                while(left < right && nums[right] == nums[right + 1]) right--;//第二个数去重(不去重也可以,增加效率)         
                
            }
            
        }
    }
    return res;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值