题源: 1. 两数之和
方法:哈希表
利用哈希表(在C++中是 unordered_map
),我们可以在一次遍历中完成查找。哈希表提供了快速的查找时间,这对于本题的需求来说非常有效。
解题步骤
-
初始化哈希表:
- 创建一个
unordered_map<int, int>
,其中键(key)为数组元素的值,值(value)为对应的索引。
- 创建一个
-
遍历数组:
- 遍历数组
nums
的每个元素,并在每个迭代中执行以下操作:- 使用
target - nums[i]
计算出与当前元素nums[i]
相配对的目标元素值。 - 使用
map.find(target - nums[i])
尝试在哈希表中查找上述目标元素值。 - 如果找到了,说明之前已经遍历过与当前元素配对的目标元素,使用
iter->second
获取该元素的索引,与当前元素的索引i
一起返回。 - 如果没有找到,将当前元素及其索引作为一对键值对插入到哈希表中,以备后续查找时使用。
- 使用
- 遍历数组
-
返回结果:
- 如果在遍历过程中找到了符合条件的两个数,函数返回这两个数的索引组成的列表
{iter->second, i}
。 - 如果遍历结束仍未找到符合条件的数,返回空列表
{}
。
- 如果在遍历过程中找到了符合条件的两个数,函数返回这两个数的索引组成的列表
代码分析
这种方法有效地将问题的时间复杂度降到了 O(n),因为每个元素只需遍历一次,并在哈希表中进行常数时间的查找。空间复杂度为 O(n),用于存储哈希表。
复杂度分析
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。每个元素查找操作的时间复杂度近似为 O(1)。 - 空间复杂度:O(n),最坏的情况下,哈希表中存储了数组
nums
中的所有元素和它们的索引。
示例
假设 nums = [2, 7, 11, 15]
,target = 9
:
- 遍历到数字 2 时,检查
9 - 2 = 7
是否在哈希表中,不在,则将 2 及其索引 0 加入哈希表。 - 遍历到数字 7 时,检查
9 - 7 = 2
已在哈希表中,找到了一个解(数字 2 和 7),函数返回它们的索引[0, 1]
。
Code
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};