返回
LeetCode 算法指南:1. 两数之和
后端
2023-10-17 15:42:03
引言
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),但哈希表法在数组元素范围较大时更具优势。掌握这些方法将为您的算法之旅奠定坚实的基础。