📜  JS 数组中两个数字之和等于给定数字 - Javascript (1)

📅  最后修改于: 2023-12-03 14:43:32.004000             🧑  作者: Mango

JS 数组中两个数字之和等于给定数字 - Javascript

在 JS 中,有时候需要找到数组中两个数字之和等于给定的数字。这个问题可以通过以下几种方法来解决:

方法一:暴力枚举

暴力枚举是一种常见的解决问题的方法。我们可以使用两重循环来遍历所有可能的组合,直到找到符合条件的组合。

function twoSum(arr, target) {
  for(let i = 0; i < arr.length; i++) {
    for(let j = i+1; j < arr.length; j++) {
      if(arr[i] + arr[j] === target) {
        return [i, j];
      }
    }
  }
  return [];
}

const arr = [2, 7, 11, 15];
const target = 9;
console.log(twoSum(arr, target)); // 输出 [0, 1]

该方法的时间复杂度为 O(n^2),不适用于大型数组。

方法二:哈希表

哈希表是一种高效的数据结构,可以用来优化寻找目标值的过程。我们可以遍历一次数组,把每个元素的值和索引存入哈希表中。然后再遍历一遍数组,检查每个元素的补数(目标值减去当前值)在哈希表中是否存在,如果存在,则返回当前值的索引和补数的索引。

function twoSum(arr, target) {
  const map = new Map();
  for(let i = 0; i < arr.length; i++) {
    const complement = target - arr[i];
    if(map.has(complement)) {
      return [map.get(complement), i];
    }
    map.set(arr[i], i);
  }
  return [];
}

const arr = [2, 7, 11, 15];
const target = 9;
console.log(twoSum(arr, target)); // 输出 [0, 1]

该方法的时间复杂度为 O(n),比暴力枚举快很多。

方法三:双指针

双指针法是一种常用的数组遍历方法。我们可以先将数组排序,然后用两个指针分别指向数组的起始位置和末尾位置。如果两个指针所指的值之和大于目标值,则右指针向左移动一位;如果两个指针所指的值之和小于目标值,则左指针向右移动一位;如果两个指针所指的值之和等于目标值,则返回两个指针的位置。

function twoSum(arr, target) {
  arr.sort((a, b) => a - b);
  let left = 0, right = arr.length - 1;
  while(left < right) {
    const sum = arr[left] + arr[right];
    if(sum === target) {
      return [left, right];
    } else if(sum < target) {
      left++;
    } else {
      right--;
    }
  }
  return [];
}

const arr = [2, 7, 11, 15];
const target = 9;
console.log(twoSum(arr, target)); // 输出 [0, 1]

该方法的时间复杂度为 O(nlogn),排序的时间复杂度为 O(nlogn)。