16.最接近的三数之和

思路:
【双指针解法】
1.首先对给定的数组从小到大排序
2.对数组进行循环遍历,首先固定一个数nums[i],在nums[i]的右侧定义双指针L,R,
L = i + 1, R = nums.length - 1
3.当L小于R时,取得sum = nums[i] + nums[L] + nums[R]的值,判断sum与target的距离,若是sum比target小则L++,若是sum比target大则R–,若是sum === target,则直接返回sum

        let nums = [ -1, 2, 1, -4 ]
        let target = 1
        var threeSumClosest = function(nums, target) {
        	// 获取nums数组的长度
            let N = nums.length
            // num的初始值为在js中可取得的最大值,后续再替换。作用是保存最接近target的数
            let num = Number.MAX_SAFE_INTEGER
            // 对数组进行从小到大排序(sort((a, b) => a - b)为从小到大排序, sort((a, b) => b - a)为从大到小排序)
            nums.sort((a, b) => a - b)
            // 遍历数组
            for(let i = 0; i < nums.length; i++) {
            	// 定义左指针L,L为i的后一位i + 1	
                let L = i + 1
                // 定义右指针R,R为数组的最后一位
                let R = N - 1
                // 当L小于R时循环
                while(L < R) {
                	// 把当前的数,也就是nums[i]与双指针指定的数值相加
                    let sum = nums[i] + nums[L] + nums[R]
                    /** 取(sum - target)和(num - target)的绝对值进行比较,
                    若是(sum - target)的值小于(num - target)的值,就把sum赋值给num。
					因为离target最近的数可能为正数也可能为负数,所以要取绝对值进行比较。
					若是(sum - target)比(num - target)要小,说明sum相距target更近,所以把
					sum复制给num										
					**/
                    if(Math.abs(sum - target) < Math.abs(num - target)) {
                        num = sum
                    }
                    /** 因为数组现在是从小到大排序,当sum小于target时,将L递增,则sum会增大 **/
                    if(sum < target) {
                        L++
                    }
					/** 当sum > target时,将R递减, 则sum会减小 **/
					else if(sum > target) {
                        R--
                    }
					/** 如果sum === target,则说明nums[i] + nums[L] + nums[R] === target,不会有其他数比sum更接近target了,所以直接返回sum即可 **/
					else {
                        return sum
                    }
                }
            }
            return num
        }
        threeSumClosest(nums, target)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值