返回

对 LeetCode 1 题的两数之和:JavaScript 的多种解法进行探索

前端

双重循环:朴素解法

双重循环是最直观的解法,通过检查数组中每个元素对的和是否等于目标值,来寻找满足条件的元素对。这种方法的时间复杂度为 O(n^2),因为需要嵌套遍历数组两次。

const 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 [arr[i], arr[j]];
      }
    }
  }
  return [];
};

哈希表:优化时间复杂度

哈希表是一种数据结构,可以根据键值快速查找元素。利用哈希表,我们可以将每个元素的值作为键值,而索引作为对应的值。在第一次迭代中,我们将数组中的元素添加到哈希表中。在第二次迭代中,对于每个元素,我们检查 target 减去这个元素的值是否存在于哈希表中。

const twoSum = (arr, target) => {
  const map = {};
  for (let i = 0; i < arr.length; i++) {
    map[arr[i]] = i;
  }
  for (let i = 0; i < arr.length; i++) {
    const complement = target - arr[i];
    if (complement in map && map[complement] !== i) {
      return [arr[i], complement];
    }
  }
  return [];
};

这种方法的时间复杂度为 O(n),因为它只需要遍历数组一次。

ES6 数组方法:优雅高效

ES6 数组方法提供了多种简洁而强大的方法,可以帮助我们更轻松地解决问题。对于两数之和,我们可以使用 reduce() 方法来计算数组中每个元素和 target 之间的差值,并使用 find() 方法来查找目标元素。

const twoSum = (arr, target) => {
  const complements = arr.map(num => target - num);
  const result = arr.find((num, index) => complements.includes(num) && arr.indexOf(num) !== index);
  return [result, target - result];
};

这种方法的时间复杂度也是 O(n),因为它只需要遍历数组一次。

结语

双重循环是两数之和问题最朴素的解法,但时间复杂度为 O(n^2)。哈希表和 ES6 数组方法都是优化时间复杂度的解法,时间复杂度都为 O(n)。在实际应用中,我们可以根据具体场景选择合适的方法。