力扣刷题#4:LeetCode217哈希表速学笔记

刷 217 题(存在重复元素)时想用哈希表,卡在 STL 语法上。学会之后发现,就三行代码的事。


题目

给你一个整数数组 nums,如果任一值出现至少两次返回 true,否则返回 false。

示例:

输入: [1,2,3,1]  → true(1 重复了)
输入: [1,2,3,4]  → false(都不重复)

我的思路

当时我脑子里已经有了完整的算法流程:

for 每个数字:
    先查哈希表  → 在表里吗? → 在 → 重复了,返回 true
    不在 → 存进哈希表
一直没重复 → 返回 false

但我卡在了STL 语法上——知道要用哈希表,不知道咋写。


学会的三个操作

解决这道题只需要会三个操作:

unordered_set<int> n;              // 声明:创建一个哈希集合
n.find(x) != n.end()               // 查找:x 在不在集合里
n.insert(x)                        // 插入:把 x 存进集合

end() 是什么?

n.end() = "集合末尾" = "没找到" 的标记

n.find(5) != n.end()   → true  = 找到了(重复了)
n.find(5) == n.end()   → true  = 没找到(第一次见)

比喻:行李寄存

unordered_set<int> n;   ← 空行李架
n.insert(5);             ← 放上箱子 5
n.find(5) != n.end()    ← 5 号箱子在架子上吗?
                         在 → 有人重复寄存了!
                         不在 → 第一次来

我的通过代码

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> n;
        int len = nums.size();
        for(int i = 0; i < len; i++){
            if(n.find(nums[i]) != n.end()){
                return true;        // 重复了
            } else {
                n.insert(nums[i]);  // 第一次见,存起来
            }
        }
        return false;               // 全部看完,没重复
    }
};

扩展:unordered_set 的兄弟姐妹

刷题常用的 STL 容器就四个,记住这个表就够了:

容器 中文名 特点 用在哪
unordered_set 哈希集合 不重复、无序、O(1) find insert erase 判断存在、去重
unordered_map 哈希字典 键值对、无序、O(1) find insert / [] erase 统计次数、映射关系
set 有序集合 不重复、自动排序 find insert erase 需要有序去重
map 有序字典 键值对、自动排序 find insert / [] erase 需要排序的映射

最常见的进阶:unordered_map

如果题目问的不是"有没有重复",而是"每个数字出现了几次",就要用 unordered_map

unordered_map<int, int> count;   // 键=数字,值=次数

// 统计每个数字出现的次数
for (int num : nums) {
    count[num]++;                // 用 [] 直接操作,不存在会自动创建
}

// 或者手动查
for (int num : nums) {
    if (count.find(num) != count.end()) {
        count[num]++;            // 已经出现过,次数+1
    } else {
        count[num] = 1;          // 第一次见
    }
}

核心区别:unordered_set 是一个篮子,unordered_map 是一个带标签的格子。

unordered_set unordered_map
存什么 单个值(int) 键值对(key, value)
查找 find(key) find(key)count[key]
插入 insert(key) insert({key, val})count[key] = val
典型用途 "出现过吗" "出现了几次" / "和谁配对"

其他常用操作

// 所有容器通用
n.size()          // 元素个数
n.empty()         // 是否为空
n.erase(x)        // 删除元素 x
n.clear()         // 清空全部

// unordered_map 特有
count[5]          // 直接访问键 5 对应的值(不存在则创建默认值)
count.at(5)       // 安全访问,不存在会抛异常

刷题中的哈希表使用场景

题号 题目 用哪个 思路
217 存在重复元素 unordered_set 遍历,查+插
1 两数之和 unordered_map 存 (当前值,下标),找 (目标-当前值)
242 有效的字母异位词 unordered_map 统计字符频率
349 两个数组的交集 unordered_set 先存一个数组,再查另一个

总结

哈希表相关的 STL 语法不需要背,记住三点就行:

  1. 声明unordered_set<类型> 名字;
  2. 查找名字.find(x) != 名字.end() → "找到了"
  3. 插入名字.insert(x)

从记不住语法到用哈希表刷完题,也就花了十分钟。


写于 2026-06-03。STL 语法不是算法能力,是工具熟练度——多写两次就熟了。
本文档有ai辅助生成元素,作者提供问题和思路,综合获得以上内容

posted @ 2026-06-03 22:53  STA_running  阅读(9)  评论(0)    收藏  举报