返回

初战leetcode,手把手教你用JavaScript解决两数之和(Two Sum)

前端

为了提高职业能力,我开始挑战leetcode的刷题之旅。leetcode是一个在线算法练习平台,汇聚了众多算法和数据结构题目,非常适合程序员提升技能。今天,我们就从第一题“两数之和(Two Sum)”开始。

题目

给你一个整数数组nums和一个目标值target。请你在该数组中找出和为目标值的那两个整数,并返回它们的索引。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

twoSum([2, 7, 11, 15], 9); // [0, 1]
twoSum([3, 2, 4], 6); // [1, 2]

方法一:暴力破解法

最直接的解决方法是暴力破解法。我们可以使用两个循环,一个循环遍历数组中的每个元素,另一个循环遍历数组中的其他元素,并检查它们是否满足和为目标值的要求。如果满足,则返回它们的索引。

const 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;
};

方法二:哈希表法

哈希表法是一种更高效的解决方法。我们可以使用哈希表来存储数组中的每个元素及其索引。然后,对于每个元素,我们可以查找哈希表中是否存在一个元素与之相加等于目标值。如果存在,则返回它们的索引。

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

方法三:双指针法

双指针法是一种更简洁的解决方法。我们可以使用两个指针,一个指向数组的开头,另一个指向数组的结尾。然后,我们比较这两个指针指向的元素之和是否等于目标值。如果等于,则返回它们的索引。如果不等于,则移动这两个指针,直到找到满足条件的元素。

const twoSum = (nums, target) => {
  let left = 0;
  let right = nums.length - 1;

  while (left < right) {
    const sum = nums[left] + nums[right];
    if (sum === target) {
      return [left, right];
    } else if (sum < target) {
      left++;
    } else {
      right--;
    }
  }

  return null;
};

总结

以上三种方法都可以解决“两数之和(Two Sum)”这个问题。暴力破解法最简单,但效率最低。哈希表法和双指针法都更有效率,但双指针法更加简洁。根据你的具体需求,你可以选择使用哪种方法。

加油,希望这篇文章对你有帮助!祝你leetcode刷题之旅顺利,早日成为一名优秀的前端工程师!