前言
这是七月集训的第二十一日,今日的训练内容是 堆(优先队列)
解题报告
1.力扣
原题链接
题目概述
现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。
实现 SmallestInfiniteSet 类:
- SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。
- int popSmallest() 移除 并返回该无限集中的最小整数。
- void addBack(int num) 如果正整数 num 不 存在于无限集中,则将一个 num 添加 到该无限集中。
解题思路
直接使用 set 。
源码剖析
class SmallestInfiniteSet {
set<int> S;
public:
SmallestInfiniteSet() {
for(int i = 1;i<1002;++i){ //直接构建即可,注意是正整数,从1开始
S.insert(i);
}
}
int popSmallest() { //第一个结点就是最小的
auto x =S.begin();
int ans = *x;
S.erase(x);
return ans;
}
void addBack(int num) { //如果find返回了S.end() 说明不存在此元素
if(S.find(num)==S.end()){
S.insert(num);
}
}
};