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_mapunordered_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) { ... }
posted @ 2025-04-11 16:15  Sylvia_lee  阅读(17)  评论(0)    收藏  举报