这道题目是力扣(LeetCode)上非常经典的一道题目,题目要求在给定数组中找到两个数,使得它们的和等于特定的目标值(target)。下面是一个详细的解题思路,包括一个时间复杂度为 O(n) 的算法。
解题思路
-
理解问题:
- 需要在数组
nums
中找到两个数,它们的和等于target
。 - 数组中的每个元素只能使用一次。
- 需要在数组
-
使用哈希表:
- 创建一个哈希表(在 Python 中为字典),用于存储遍历过程中遇到的每个数字及其索引。
- 哈希表的键为数组中的元素值,值为该元素的索引。
-
遍历数组:
- 遍历数组
nums
,对于每个元素num
:- 计算
complement
,即target - num
,这是我们需要找到的另一个数。 - 检查
complement
是否已经在哈希表中:- 如果在,说明我们找到了两个数,它们的和为
target
,返回这两个数的索引。 - 如果不在,将当前元素
num
及其索引存入哈希表。
- 如果在,说明我们找到了两个数,它们的和为
- 计算
- 遍历数组
-
处理特殊情况:
- 如果数组中存在重复元素,需要确保不会重复使用同一个元素。
-
代码实现:
- 使用 Python 语言,可以简洁地实现上述逻辑。
Python 代码示例
python
def two_sum(nums, target):
num_to_index = {} # 创建哈希表
for index, num in enumerate(nums):
complement = target - num # 计算需要的另一个数
if complement in num_to_index: # 检查哈希表中是否存在这个数
return [num_to_index[complement], index] # 返回两个数的索引
num_to_index[num] = index # 将当前数和索引存入哈希表
return [] # 如果没有找到,返回空列表
# 示例测试
print(two_sum([2, 7, 11, 15], 9)) # 输出: [0, 1]
print(two_sum([3, 2, 4], 6)) # 输出: [1, 2]
print(two_sum([3, 3], 6)) # 输出: [0, 1]
进阶思考
- 时间复杂度:上述算法的时间复杂度为 O(n),因为我们只遍历了数组一次,并且哈希表的查找操作平均时间复杂度为 O(1)。
- 空间复杂度:空间复杂度为 O(n),因为最坏情况下,我们可能需要将所有元素存储在哈希表中。
这个算法有效地解决了问题,并且满足了题目中对时间复杂度的要求。