返回

LeetCode 算法指南:1. 两数之和

后端

引言

LeetCode 是一个著名的在线算法平台,为程序员提供了一个磨练技能、提高算法知识和解决实际问题的场所。两数之和是一个基础性问题,也是许多算法和数据结构的基础。掌握它将为您的算法之旅奠定坚实的基础。

算法详解

暴力求解

最直接的方法是暴力求解,即枚举所有可能的数组对,检查它们的和是否等于目标值。这种方法虽然简单,但时间复杂度为 O(n^2),效率较低。

双指针

双指针法是一种更有效的解决方法。它使用两个指针从数组的两端向中间移动,并在每次比较两个指针指向的元素之和时更新指针的位置。当两个元素之和等于目标值时,返回它们的索引。这种方法的时间复杂度为 O(n),效率明显提高。

哈希表

哈希表是一种数据结构,可以快速查找和插入元素。我们可以使用哈希表来存储数组中已遍历过的元素。当我们遇到一个元素时,我们可以检查其补数是否已经在哈希表中。如果存在,则返回两个元素的索引。这种方法的时间复杂度也为 O(n),并且在数组元素范围较大时更具优势。

代码示例

Python

def twoSum(nums, target):
  # 使用哈希表存储已遍历过的元素
  hashtable = {}

  # 遍历数组
  for i in range(len(nums)):
    # 计算补数
    complement = target - nums[i]

    # 检查补数是否在哈希表中
    if complement in hashtable:
      # 返回两个元素的索引
      return [hashtable[complement], i]

    # 将当前元素添加到哈希表
    hashtable[nums[i]] = i

  # 未找到两数之和
  return None

C++

vector<int> twoSum(vector<int>& nums, int target) {
  unordered_map<int, int> hashtable;

  for (int i = 0; i < nums.size(); i++) {
    int complement = target - nums[i];

    if (hashtable.find(complement) != hashtable.end()) {
      return {hashtable[complement], i};
    }

    hashtable[nums[i]] = i;
  }

  return {};
}

总结

两数之和是一个经典的算法问题,可以通过多种方法解决。暴力求解效率较低,双指针法和哈希表法的时间复杂度均为 O(n),但哈希表法在数组元素范围较大时更具优势。掌握这些方法将为您的算法之旅奠定坚实的基础。