📌  相关文章
📜  给定一个已排序的数组和一个数字x,在数组中找到总和最接近x的对(1)

📅  最后修改于: 2023-12-03 15:27:34.374000             🧑  作者: Mango

给定一个已排序的数组和一个数字x,在数组中找到总和最接近x的对

在这个问题中,我们需要在一个已排序的数组中查找一对数,使它们的和最接近给定的数字x。这是一道经典的问题,可以使用两个指针来解决。

解决方案
  1. 初始化两个指针,一个指向数组的起始位置,一个指向数组的末尾。
  2. 计算指针所指位置的元素的和sum,如果sum等于x,则找到匹配对,返回。
  3. 如果sum小于x,则将左侧的指针向右移动,以增加sum的值。
  4. 如果sum大于x,则将右侧的指针向左移动,以减少sum的值。
  5. 在移动指针时,记录当前的最小差值和最接近的一对数。

以下是JavaScript的实现代码:

function findClosestPair(arr, x) {
  let left = 0;
  let right = arr.length - 1;
  let closestPair = [arr[left], arr[right]];
  let closestDiff = Math.abs(x - (arr[left] + arr[right]));

  while (left < right) {
    const sum = arr[left] + arr[right];
    const diff = Math.abs(x - sum);

    if (diff < closestDiff) {
      closestPair = [arr[left], arr[right]];
      closestDiff = diff;
    }

    if (sum === x) {
      return closestPair;
    } else if (sum < x) {
      left++;
    } else {
      right--;
    }
  }

  return closestPair;
}

const arr = [-3, -2, 0, 1, 3];
const x = 1;
console.log(findClosestPair(arr, x)); // 输出 [-2, 3]
复杂度分析

这个算法的时间复杂度是O(n),其中n是数组的长度。由于我们每次迭代时只移动了一个指针,因此空间复杂度是O(1)。