力扣-最接近三数之和 中等 🌍

简介: 力扣-最接近三数之和 中等 🌍

前言

数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有写出高质量代码的潜意识

一、问题描述

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

输入:nums = [0,0,0], target = 1
输出:0

提示:

  • 3 <= nums.length <= 1000
  • 1000 <= nums[i] <= 1000
  • 104 <= target <= 104

二、思路讲解

这个问题三数之和非常类似,没有做过三树之和问题的小伙伴,可以先去看这篇:力扣-三数之和题解的关键在去记录,三数之和于target之间的差值,其次采用迭代 + 双指针的方式去找到所有可能的三数之和。

优化:

  • 迭代的过程其实是找 三数中的第一个数 n1,如果之前寻找过这个n1了就不需要找了,做法也很简单,给nums排个序就行。
  • 和三数之和不同的是,最接近三数之和问题,两者之间的差值可能为负数,所以需要有个状态变量flag记录差值是否小于0
  • 如果差值小于零,也就是我们的sum(n1 + n2 + n3) 太小了,可以让左指针往右移动,让结果变大,反之亦然

三、AC代码

时间复杂度O(nlogn) 空间 O(1)

var threeSumClosest = function(nums, target) {
    let res = Infinity
    let minPoor = Infinity
    nums.sort((a, b) => a - b)
    for(let i = 0;i< nums.length - 1; i++){
        let n1 = nums[i]
        if(i >= 1 && n1 == nums[i - 1]) continue
        let left = i + 1 , right = nums.length - 1 
        while(left < right){
            let n2 = nums[left] , n3 = nums[right]
            let cur = n1 + n2 + n3
            let poor = cur - target
            let flag = false
            if(poor<0){
                flag = true
                poor = -poor
            }
            if(poor<minPoor){
                res = cur
                minPoor = poor
            }
            if(flag){
                while(left < right && n2 == nums[left]) left ++ 
            }else{
                while(left < right && n3 == nums[right]) right --
            } 
        }
    }
    return res
};

image.png

后续

好了,本篇 力扣-最接近三数之和到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。


相关文章
|
3月前
|
算法
LeetCode第16题最接近的三数之和
该文章介绍了 LeetCode 第 16 题最接近的三数之和的解法,与第 15 题类似,通过双指针法减少循环次数,根据差值的绝对值来更新最接近的和,并总结了双指针可减少循环次数的要点。
|
3月前
|
Python
【Leetcode刷题Python】16. 最接近的三数之和
解决LeetCode "最接近的三数之和" 问题的Python实现,通过排序和双指针法,记录并更新与目标值最接近的三数之和。
35 1
|
5月前
|
存储 算法 数据挖掘
LeetCode第十六题: 掌握双指针技巧 最接近的三数之和 【python】
LeetCode第十六题: 掌握双指针技巧 最接近的三数之和 【python】
|
6月前
leetcode-16:最接近的三数之和
leetcode-16:最接近的三数之和
50 0
【LeetCode-每日一题】-16. 最接近的三数之和
【LeetCode-每日一题】-16. 最接近的三数之和
|
11月前
|
Java
1657. 确定两个字符串是否接近 --力扣 --JAVA
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a ) 你可以根据需要对任意一个字符串多次使用这两种操作。 给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
43 0
LeetCode: 16. 最接近的三数之和 | 双指针专题
【LeetCode: 16. 最接近的三数之和 | 双指针专题 】
56 1
|
存储 算法 Python
【力扣算法01】之最接近的三数之和
【力扣算法01】之最接近的三数之和
80 0
|
测试技术 C++
力扣16-最接近的三数之和&力扣18-四数之和
力扣16-最接近的三数之和&力扣18-四数之和
82 0
|
算法 安全 Swift
LeetCode - #16 最接近的三数之和
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。