题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
思路与算法
- 暴力解法:使用两层循环枚举所有可能的数对,时间复杂度为 O(n²)。
- 优化思路:利用哈希表记录已经遍历过的数字,从而在一次遍历中实现查找,降低时间复杂度到 O(n)。
题目中说明“每种输入只会对应一个答案”,这意味着对于每个元素,其唯一的补数只会出现一次。因此可以在遍历过程中将已经访问过的元素存储起来,以便后续快速判断。
哈希表提供了平均 O(1) 的查找时间,可以在一次遍历中快速查找某个数。
使用哈希表可以直接记录每个数字对应的下标,当我们遍历到一个数,若其补数已经出现,我们也可以返回两数的下标。
代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 使用哈希表(字典)记录已经遍历过的数字及其下标,格式为 {数值: 下标}
seen = {}
# 遍历数组,枚举当前数字和其下标
for i, num in enumerate(nums):
# 对于每个数字 num,计算其补数 complement = target - num
complement = target - num
if complement in seen:
return [seen[complement], i]
# 否则,将当前数字及其下标存入字典,继续遍历
seen[num] = i
# 根据题目要求,输入数据总能找到唯一解,因此不会执行到此处
return []
总结
- 哈希表查找:利用哈希表(字典)的 O(1) 查找特性,能够快速确定某个值是否已经出现过。
- 通过在遍历过程中边查找边存储数据,可以将原本的双重循环优化为一次循环,显著降低时间复杂度。
- 在数据规模适中的情况下,使用 O(n) 的额外空间换取 O(n) 的时间复杂度是一个很常见且合理的权衡。
- 哈希表查找非常适合用来“寻找补数”,本题就是一个模板。
- enumerate 是 Python 内置的一个函数,用于在遍历可迭代对象(如列表、元组、字符串等)时,同时获取元素的
索引
和值