LeetCode - 16 最接近的三数之和

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

16. 最接近的三数之和 - 力扣(LeetCode)

题目描述

给你一个长度为 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
  • -10^4 <= target <= 10^4

题目解析

本题其实就是LeetCode - 15 三数之和_伏城之外的博客-CSDN博客扩展题,都是找三元组。找三元组的逻辑和leetcode 15的逻辑一致,都是利用双指针,这块逻辑可以参考链接博客解析。

区别在于,本题要找的三元组,是和最接近target的,而不是完全等于target的。

因此,当三元组的和sum:

  • sum == target时,可以直接返回此时的sum作为题解,因此sum与target的差距为0,是肯定最接近的。
  • sum != target,此时我们需要求解 abs(sum - target) 差距,保留最小差距对应sum,作为一个可能解,之后关于l, r指针的运动,需要看sum和target的具体大小关系
  1. 如果 sum > target,那么下一次我们应该 r--,来减小三元组和,来让sum接近target
  2. 如果 sum < target,那么下一次我们应该 l++,来增加三元组和,来让sum接近target

JS算法源码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function (nums, target) {
  nums.sort((a, b) => a - b);

  let ans;
  let minDiff = Infinity;

  for (let i = 0; i < nums.length - 2; i++) {
    let l = i + 1;
    let r = nums.length - 1;

    while (l < r) {
      const sum = nums[i] + nums[l] + nums[r];

      if (sum == target) {
        return sum;
      } else {
        const diff = Math.abs(sum - target);
        if (diff < minDiff) {
          minDiff = diff;
          ans = sum;
        }

        if (sum > target) {
          r--;
        } else {
          l++;
        }
      }
    }
  }

  return ans;
};

最接近的三数之和 - 提交记录 - 力扣(LeetCode)

LeetCode - 16 最接近的三数之和_第1张图片

Java算法源码

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);

        int minDiff = Integer.MAX_VALUE;
        int ans = 0;

        for(int i = 0; i < nums.length; i++) {
            int l = i + 1;
            int r = nums.length - 1;

            while(l < r) {
                int sum = nums[i] + nums[l] + nums[r];

                if(sum == target) {
                    return sum;
                } else {
                    int diff = Math.abs(sum - target);
                    if(diff < minDiff) {
                        minDiff = diff;
                        ans = sum;
                    }

                    if (sum > target) {
                        r--;
                    } else {
                        l++;
                    }
                }
            }
        }

        return ans;
    }
}

最接近的三数之和 - 提交记录 - 力扣(LeetCode)

LeetCode - 16 最接近的三数之和_第2张图片

Python算法源码

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()

        minDiff = -1
        ans = 0

        for i in range(len(nums)):
            l = i + 1
            r = len(nums) - 1

            while l < r:
                total = nums[i] + nums[l] + nums[r]

                if total == target:
                    return total
                else:
                    diff = abs(total - target)

                    if minDiff == -1 or diff < minDiff:
                        minDiff = diff
                        ans = total

                    if total > target:
                        r -= 1
                    else:
                        l += 1

        return ans

最接近的三数之和 - 提交记录 - 力扣(LeetCode)

LeetCode - 16 最接近的三数之和_第3张图片

你可能感兴趣的:(算法刷题,leetcode,算法,Java,JavaScript,Python)