【LeetCode75】第五十题 无限集中的最小数字

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

这是我们在LeetCode75里遇到的第二道设计类题目,难度比上一次的设计题目要难上一些。

题目假设我们拥有一个从1开始的无限集。

设计的这个类有两个调用函数,一个让我们将无限集中最小的数移出并返回,另一个函数让我们再将一个不在无限集里的数添加会无限集里。

那么题目有给出条件,重新加回无限集的数不会大于100,并且调用次数的总和不会超过1000次。

那么我们可以直接拿一个数组来存放1000个数字来模拟无限集,因为就算1000次调用的都是移除最小值,那么1000个数字也是刚好够移除的。

不过这仅仅是理论可行,因为直接模拟的话,是会超时的。

我们可以逆向思考一下,我们不存放存在无限集的数字,我们存放被移出无限集的数字。

并且我们使用set来存放,这样每次移除最小数的时候,我们从1开始寻找set,如果数字不在set里,那么我们就把数字加入到set里来表示这个数被我们移除了。

添加回无限集的时候就更简单了,我们直接寻找要添加的数在不在我们的set里,如果在,我们就把set里的这个数字移除来表示添加回无限集里,因为set里存放的是被移出无限集的数,这样可能有点绕,大家结合着下面的代码再捋一捋。

代码:

cpp 复制代码
class SmallestInfiniteSet {
public:
    unordered_set<int>jihe; //存放的实际上是被移出无限集的元素
    SmallestInfiniteSet() {
        
    }
    
    int popSmallest() {
        int i=1;
        while(jihe.find(i)!=jihe.end()){    //从1开始寻找没有被移出无限集的数,第一个找到的就是最小数
            i++;
        }
        jihe.insert(i); //找到之后插入set表示该数被移出无限集
        return i;
    }
    
    void addBack(int num) {
        //如果该数在set里,也就是被无限集移出了,那么我们再将其移出set表示重新加回无限集里
        if(jihe.find(num)!=jihe.end()){ 
            jihe.erase(num);
        }
    }
};
相关推荐
爱睡懒觉的焦糖玛奇朵4 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具使用说明】
人工智能·python·深度学习·学习·算法·yolo·音视频
Runawayliquor5 小时前
opbase:CANN 所有算子的公共地基
大数据·数据库·人工智能·算法
徐安安ye5 小时前
FlashAttention 为什么对序列长度这么“敏感”?
人工智能·算法
潜创微科技5 小时前
IT6520:USB‑C 转 MIPI 芯片方案 4K@120Hz 高清显示
c语言·开发语言
言之。6 小时前
【Python】免费的中文 AI 配音方案
开发语言·人工智能·python
kyle~6 小时前
机器视觉---熔池相机(穿透强光的视觉感知)
c++·数码相机·计算机视觉·机器人·焊接机器人
宏笋6 小时前
C++ Coroutines(协程) 详解
c++
天天进步20156 小时前
Python全栈项目:从零手操一个高性能 API 网关
开发语言·python
Java面试题总结6 小时前
java高频面试题(2026最新)
java·开发语言·jvm·数据库·spring·缓存
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维前缀和】:求区间和
c++·前缀和·csp·高频考点·信奥赛·求和区间和