常见的面试题:JavaScript 中的两项之和算法

想象一下,你在一个部门团建活动的舞台上,每个人背上都背着一个特定的数字。活动主持人宣布一个游戏,找到两个人的数字之和等于这个神奇的数字,你就赢了奖品。

这个场景完美地抓住了算法挑战领域中广受喜爱的经典问题“两项之和”的本质。在本文中,我们将介绍两种不同的解决方案。

两项之和

目标:给定一个整数数组,返回两个数字的索引,使它们相加等于特定目标。例如,如果输入是10,并且我们有一个数组 [5, 1, 5, 3],则返回值应该是 [0, 2],因为索引 0 是 5,索引 2 也是 5,它们相加等于 10 目标值。

这个问题听起来可能很简单,但它却为多种方法打开了大门,从遍历到更优雅的算法。下面的第一个解决方案可能有点慢,但不用担心,我们会在第二个解决方案中加快一点速度!

遍历计算

第一种方法就像经典的舞蹈动作,简单但有效。我们检查数组中每个可能的对,看看它们的总和是否与目标相匹配。

在深入研究解决方案之前,让我们先看一些伪代码。

// 遍历每个元素
// 对于每个元素,迭代它后面的元素,例如 nums[j],其中 j > i。
// If nums[i] + nums[j] === target
// 返回索引

将其使用 JavaScript 编写:

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

console.log(twoSum([2, 7, 11, 15], 9)); // [0, 1]

如果输入包含一个包含一百万或更多元素的数组,会发生什么?那么,在这种情况下,代码可能需要很长时间才能运行。

上述解决方案的时间复杂度为 O(n^2)。我们可以做得更好吗?当然可以!让我们使用哈希表来升级我们的代码,使其更加高效。

使用哈希表

接下来要展示的解决方案是使用哈希映射来存储元素的索引。哈希映射(哈希表)是一种存储键值对的数据结构,允许通过称为哈希的过程根据键快速检索值。

这样,我们就可以在常数时间内找到当前元素的补数。命名变量 complement 的原因是,对于给定的元素 nums[i],我们正在寻找数组中的另一个元素,使它们的和等于目标值。这个其他元素是当前元素相对于目标和的补数。

function twoSumHashMap(nums, target) {
  const numToIndex = {};

  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    
    if (numToIndex[complement] !== undefined) {
      return [numToIndex[complement], i];
    }

    numToIndex[nums[i]] = i;
  }
  return null;
}
console.log(twoSumHashMap([2, 7, 11, 15], 9)); // [0, 1]

这个算法比之前的算法快得多,尽管它确实为哈希映射提供了额外的空间。

上面的代码中,我们可以在常数时间内找到当前元素的补数是指检查补数是否存在于哈希映射中所需的时间,对于每个单独的查找时间复杂度是 O(1)。

然而,由于我们需要为数组中的每个元素执行此检查,整个算法的总时间复杂度为 O(n)。

总结

这就是一个非常有趣的算法挑战,有两种不同的解决方案,我们希望这篇文章能更好地为你的下一次面试做准备。你是否曾在面试中被要求解决这个算法问题?如果是的话,请在下方评论中告诉我。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值