常见的面试题: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)。
总结
这就是一个非常有趣的算法挑战,有两种不同的解决方案,我们希望这篇文章能更好地为你的下一次面试做准备。你是否曾在面试中被要求解决这个算法问题?如果是的话,请在下方评论中告诉我。
原文地址:https://blog.csdn.net/ikxin/article/details/140548752
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!