Skip to main content

最接近的三数之和

题目

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

提示:
  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -10⁴ <= target <= 10⁴
示例

输入: nums = [-1, 2, 1, -4], target = 1

输出: 2

解释: 与 target 最接近的和是 2 (-1 + 2 + 1 = 2)

题解

首先先说一下怎么找三个数: 即固定一个数(一趟循环), 然后里面再来一次循环, 让两个指针游走, 这样来定位到三个数.

为了防止找重, 首先将数组排序, 这样的目的是找三个数

/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function (nums, target) {
const n = nums.length
// 先给数组排序, 便于后面使用双指针
nums.sort((a, b) => a - b)

// 初始化一个 ans
let ans = nums[0] + nums[1] + nums[2]

// 固定住 i
for (let i = 0; i < n; i += 1) {
// 游走 start 和 end
let start = i + 1,
end = n - 1

while (start < end) {
const sum = nums[i] + nums[start] + nums[end]

// 说明 sum 这一组值的和更接近 target
if (Math.abs(target - sum) < Math.abs(target - ans)) {
ans = sum
}

if (sum > target) {
end--
} else if (sum < target) {
start++
} else {
return ans
}
}
}

return ans
}

复杂度分析

  • 时间复杂度: O(n²)

  • 空间复杂度: O(1)