给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

    示例:

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

    提示:

    3 <= nums.length <= 10^3
    -10^3 <= nums[i] <= 10^3
    -10^4 <= target <= 10^4

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum-closest

    思路:
    思路与15.三数之和类似,先对数组排序,定义ilr三个指针。
    定义sum = nums[i] +nums[l] +nums[r]

    • 如果sum ==target,必然是最接近的三数和,直接返回target。
    • 否则每次更新 最接近的三数和 :best = Math.min(Math.abs(sum-target),Math.abs(best-target))
    • 如果sum<targetr左移
    • 如果sum>targetl右移

    如果都不满足sum==target,最后返回结果best
    复杂度分析:
    时间复杂度O(n)
    空间复杂度O(log) 排序产生的额外空间

    1. var threeSumClosest = function (nums, target) {
    2. nums = nums.sort((a, b) => a - b);
    3. let n = nums.length;
    4. let best = 1e6;
    5. function update(sum) {
    6. if (Math.abs(sum - target) < Math.abs(best - target))
    7. best = sum;
    8. }
    9. for (let i = 0; i < n; i++) {
    10. if (i > 0 && nums[i] === nums[i - 1]) continue;
    11. let l = i + 1;
    12. let r = n - 1;
    13. while (l < r) {
    14. sum = nums[i] + nums[l] + nums[r];
    15. if (sum === target) {
    16. return target;
    17. }
    18. update(sum);
    19. if (sum > target) {
    20. let r0 = r - 1;
    21. while (r0 > l && nums[r0] === nums[r]) r0--;
    22. r = r0;
    23. } else {
    24. let l0 = l + 1;
    25. while (l0 < r && nums[l0] === nums[l]) l0++;
    26. l = l0;
    27. }
    28. }
    29. }
    30. return best;
    31. };