问题概述
给定一个整数数组 nums 和一个整数 target,返回两个数字的索引,使得它们相加等于 target。
解法 1:暴力法
工作原理
暴力法很简单:检查数组中每一对可能的数字。
python
class Solution:
def twoSum(self, nums, target):
n = len(nums)
for i in range(n):
for j in range(i + 1, n):
if nums[i] + nums[j] == target:
return [i, j]
return []
复杂度分析
- 时间复杂度: O(n²) - 我们遍历所有对,共有 n(n-1)/2 次操作
- 空间复杂度: O(1) - 只使用常数额外空间
何时使用
- 简单易懂
- 适用于小规模输入
- 无额外内存开销
- 不推荐用于大数组,因为时间复杂度是平方级
解法 2:哈希表法
工作原理
不使用暴力检查,我们使用哈希表(字典)存储已见过的数字及其索引。对于每个数字,我们检查其补数(target - 当前数字)是否存在于映射中。
python
class Solution:
def twoSum(self, nums, target):
num_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return [num_map[complement], i]
num_map[num] = i
return []
关键洞察
数字 num 的补数是 target - num。如果我们已经见过这个补数,就找到了我们的配对!
复杂度分析
- 时间复杂度: O(n) - 单次遍历数组
- 空间复杂度: O(n) - 哈希表最多存储 n 个元素
何时使用
- 推荐用于大多数情况
- 对于大规模输入高效
- 线性时间复杂度使其可扩展
- 权衡:使用额外内存存储哈希表
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| 暴力法 | O(n²) | O(1) | 小数组,学习 |
| 哈希表 | O(n) | O(n) | 生产代码,大数组 |
总结
哈希表方法展示了经典的时间-空间权衡:我们使用额外内存来实现线性时间复杂度,使其成为两数之和问题的最优解。