LeetCode 1 两数之和 | 哈希表
目录
1. 两数之和
Problem:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
Solution:
Tag : 哈希表
复杂度:时间O(n) 空间O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); i++) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};
Extend:
1.C++中的hashmap:
1. unordered_map(无序映射)
核心特性
- 存储键值对(
<key, value>),每个键唯一不重复。 - 支持通过键快速查找值,平均时间复杂度为 O(1)(最坏情况下为 O(n),如哈希冲突严重时)。
底层实现
- 哈希表结构,使用 链地址法(拉链法) 解决冲突。
- 哈希函数将键映射到桶(bucket),同一桶内冲突的键值对以链表存储。
典型应用
- 缓存系统、字典查找(如网页中的单词转换程序)。
2. unordered_set(无序集合)
核心特性
- 存储唯一键(不重复),不包含值部分。
- 支持快速判断键是否存在,时间复杂度与
unordered_map一致。
底层实现
- 类似
unordered_map,但仅存储键而非键值对。
典型应用
- 去重操作、集合运算(交集、并集等)。
3. unordered_multimap(无序多重映射)
核心特性
- 允许键重复,每个键可关联多个值。
- 查找时返回同一键的所有关联值。
底层实现
- 每个桶内的链表可存储多个相同键的键值对。
典型应用
- 多值索引(如日志记录中同一用户的多条操作)。
4. unordered_multiset(无序多重集合)
核心特性
- 允许键重复,存储多个相同键。
底层实现
- 类似
unordered_multimap,但仅存储键。
典型应用
- 统计元素出现次数(需结合计数逻辑)。
5.与传统有序容器的区别
| 特性 | unordered_* 系列 |
map/set 系列(有序) |
|---|---|---|
| 底层数据结构 | 哈希表(哈希桶) | 红黑树(平衡二叉搜索树) |
| 元素顺序 | 无序 | 按键升序排列 |
| 插入/查找时间复杂度 | 平均 O(1),最坏 O(n) | O(log n) |
| 适用场景 | 快速查找,无需排序 | 需有序遍历或范围查询 |
2.unordered_map常用函数列表
| 函数/操作符 | 描述 | 示例代码 |
|---|---|---|
insert |
插入键值对。若键已存在,不覆盖原有值。 | my_map.insert({"apple", 5}); 或 my_map.insert(std::make_pair("apple", 5)); |
emplace |
直接通过参数构造键值对(避免临时对象拷贝)。 | my_map.emplace("apple", 5); |
at |
通过键访问值。若键不存在,抛出 std::out_of_range 异常。 |
int val = my_map.at("apple");(安全访问) |
erase |
删除指定键或迭代器指向的元素。 | my_map.erase("apple"); 或 my_map.erase(it); |
find |
查找指定键,返回迭代器。若未找到,返回 end()。 |
auto it = my_map.find("apple"); if (it != my_map.end()) { /* 存在 */ } |
count |
返回键的出现次数(对 unordered_map和 unordered_set始终为 0 或 1)。 |
|
size |
返回当前元素数量。 | int num = my_map.size(); |
empty |
判断容器是否为空。 | if (my_map.empty()) { /* 空 */ } |
clear |
清空所有元素。 | my_map.clear(); |
reserve |
预分配桶的数量(优化性能,减少哈希冲突)。 | my_map.reserve(100); |
begin / end |
返回指向容器首元素/尾后位置的迭代器(支持 const_iterator)。 |
for (auto it = my_map.begin(); it != my_map.end(); ++it) { ... } |

浙公网安备 33010602011771号