Appearance
Set / Map
目标:面向秋招算法题,能够根据“是否只需要存在性”与“是否需要附加状态”快速选择 Set 或 Map,并能设计 Map 的 key/value。
一句话理解
text
Set
→ 只关心 key 是否存在
→ membership
Map
→ key → value
→ 除了存在性,还需要保存与 key 关联的状态常见语言对应:
text
Python: set / dict
Java: HashSet / HashMap
C++: unordered_set / unordered_mapSet / Map 更接近使用层面的抽象;Hash Table 是它们非常常见的底层实现。
Set 高频模式
适合:
- 去重;
- 判断是否出现过;
- 判断是否重复;
- 判断两个集合是否存在交集;
- DFS/BFS 中的
visited。
标准问题:
“这个元素以前有没有出现过?”
示例:判断数组是否存在重复元素。
python
seen = set()
for x in nums:
if x in seen:
return True
seen.add(x)
return False平均时间复杂度:
text
O(n)额外空间:
text
O(n)Map 高频模式
Map 适合保存:
text
元素 → 出现次数
元素 → 下标
元素 → 最近位置
类别 → 对象列表
对象 → 状态设计 Map 时优先问两个问题:
text
未来我要通过谁来查询?
→ key
查询以后还需要得到什么?
→ value即:
key = 查询对象;value = 与该对象关联、未来真正需要的状态。
Frequency Counting
python
count = {}
for x in nums:
count[x] = count.get(x, 0) + 1此时:
text
key = 元素
value = 出现次数count.get(x, 0) 表示:若 x 已存在则读取当前计数,否则使用默认值 0。
Position / Latest State
如果题目需要“最后一次出现的位置”:
python
last = {}
for i, x in enumerate(nums):
last[x] = i保存:
text
元素 → 最近下标Map 不需要保存全部历史,只保存未来解题真正需要的状态。
这是一个重要原则:
不保存所有发生过的事情,只保存未来查询所需要的最小状态。
One-to-Many Mapping
Map 的 value 不一定是一个数字,也可以是 list / set / object。
例如按班级分组:
text
班级 → 学生列表python
groups = {
1: ["张三", "王五"],
2: ["李四"]
}Two Sum
一遍 Hash Map 的常见写法:
python
pos = {}
for i, x in enumerate(nums):
need = target - x
if need in pos:
return [pos[need], i]
pos[x] = i推荐固定的 mental model:
text
key = 已经出现的数
value = 该数对应的下标算法模式:
text
遍历当前元素 x
→ 推导需要查询的对象 need
→ 在历史状态中平均 O(1) 查询
→ 保存当前状态供未来使用也可以反向设计为“补数 → 当前下标”,但秋招中优先熟悉“已出现的值 → 下标”的标准写法。
Set vs Map Decision Tree
text
需要记录历史信息?
│
├── 否
│ └── 不一定需要 Hash
│
└── 是
│
├── 只关心有没有?
│ └── Set
│
└── 还需要次数 / 下标 / 状态 / 对象?
└── Map可以压缩为:
text
Set = membership
Map = membership + stateReview Focus
后续通过真实算法题继续强化:
- 去重 / 重复检测;
- Frequency Counting;
- Complement Lookup;
- 最近位置;
visited;- 后续 Sliding Window + Hash。
Practice:
04_Practice/CS_MCQs/Data_Structure_Lesson_2.md
Mistakes:
05_Mistakes/CS.md
Interview QA:
06_Interview/CS_QA/Data_Structure.md