1. 题目解析与需求拆解
这道来自复旦大学考研机试题的集合操作题目,核心是考察对STL中set容器的理解和应用能力。题目要求我们处理两个可能包含重复元素的集合,最终输出它们的交集和并集的元素个数。
输入输出分析:
- 输入包含三行:
- 两个整数n和m,分别表示两个集合的元素个数
- 第一个集合的n个元素(可能有重复)
- 第二个集合的m个元素(可能有重复)
- 输出要求两个整数,用空格分隔:
- 交集元素个数
- 并集元素个数
关键约束条件:
- 数据规模较大(n,m ≤ 10^5),需要O(n)或O(nlogn)的算法
- 元素值范围在[1, 10^9],int类型足够存储
- 最终的交集和并集必须去重
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STL set容器特性解析
2.1 set的核心特性
STL中的set是基于红黑树实现的关联容器,具有以下关键特性:
- 自动去重:插入相同元素时只会保留一个
- 自动排序:元素默认按升序排列
- 查找高效:O(logn)时间复杂度
- 插入/删除:O(logn)时间复杂度
cpp复制#include <set>
using namespace std;
set<int> s; // 声明一个int类型的set
2.2 unordered_set的选用考量
题目解法中使用了unordered_set而非set,这是基于以下考虑:
- 不需要有序性:题目只关心元素存在性,不要求排序
- 查找效率更高:unordered_set基于哈希表,平均O(1)的查找时间
- 插入效率更高:平均O(1)的插入时间
cpp复制#include <unordered_set>
using namespace std;
unordered_set<int> us; // 声明一个int类型的unordered_set
注意:unordered_set在极端情况下可能退化为O(n)时间复杂度,但对于ACM/机试场景,通常不需要考虑这种最坏情况
3. 算法实现详解
3.1 数据结构设计
题目解法使用了三个unordered_set:
- a:存储第一个集合(自动去重)
- b:存储第二个集合(自动去重)
- u:存储并集结果
cpp复制unordered_set<int> a, b, u;
3.2 输入处理流程
- 读取n和m
- 读取第一个集合的n个元素,同时插入到a和u中
- 读取第二个集合的m个元素,同时插入到b和u中
cpp复制cin >> n >> m;
while(n--) {
cin >> x;
a.insert(x);
u.insert(x); // 并集收集
