Leetcode2336 无限集中的最小数字

简介: Leetcode2336 无限集中的最小数字

题目:

现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...]

实现 SmallestInfiniteSet 类:

  • SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。
  • int popSmallest() 移除 并返回该无限集中的最小整数。
  • void addBack(int num) 如果正整数 num 存在于无限集中,则将一个 num 添加 到该无限集最后。

示例:

输入

["SmallestInfiniteSet", "addBack", "popSmallest", "popSmallest", "popSmallest", "addBack", "popSmallest", "popSmallest", "popSmallest"]

[[], [2], [], [], [], [1], [], [], []]

输出

[null, null, 1, 2, 3, null, 1, 4, 5]


解释

SmallestInfiniteSet smallestInfiniteSet = new SmallestInfiniteSet();

smallestInfiniteSet.addBack(2);    // 2 已经在集合中,所以不做任何变更。

smallestInfiniteSet.popSmallest(); // 返回 1 ,因为 1 是最小的整数,并将其从集合中移除。

smallestInfiniteSet.popSmallest(); // 返回 2 ,并将其从集合中移除。

smallestInfiniteSet.popSmallest(); // 返回 3 ,并将其从集合中移除。

smallestInfiniteSet.addBack(1);    // 将 1 添加到该集合中。

smallestInfiniteSet.popSmallest(); // 返回 1 ,因为 1 在上一步中被添加到集合中,

                                  // 且 1 是最小的整数,并将其从集合中移除。

smallestInfiniteSet.popSmallest(); // 返回 4 ,并将其从集合中移除。

smallestInfiniteSet.popSmallest(); // 返回 5 ,并将其从集合中移除。

题目分析:

本题本质就是要实现两个操作:1、popSmallest() 2、addBack(num)。这里我们遇到第一个问题为什么初始化操作不用去实现。

解决这个问题要我们明确一个前提:无限集是无法实际在计算机中存储的。

所以对所谓无限集的操作仅仅是逻辑层面的,也就是说并不是创建一个真实的数组实际层面对数组对内层进行操作。而是逻辑上模拟内存的操作并进行输出结果。

接下来考虑如何实现pop和add操作:

pop操作:既然无限数组没有存在,那么我们仅仅需要模拟即可。所以就创建一个变量,记录目前弹出的无限集中的最大值的下一个。一开始指向1,1弹出后指向2,2弹出后指向3,如此循环。

add操作:由于上面的pop操作将无限集分为两个部分(分别是前面表示已经弹出的部分记为A,和后面未弹出的部分记为B),所以对于add操作,我们必然要考虑是add到哪一部分。如果是B部分,则不需要添加;如果是A部分,则需要添加进入数组,由于下次pop时必然是pop这里新加入的数所在的A部分中的最小数,所以这里要创建一个集合,用来存储add到A的数据。考虑到pop是弹出A中的最小值,所以要时刻保持集合中的数据有序,这里就采用set集合来保证。set集合内部维护采用的是堆排序。

当然分析到这里add会导致pop的方法改变。

图解分析:

代码如下:

class SmallestInfiniteSet {
public:
    SmallestInfiniteSet() {}
    
    int popSmallest() {
        if (s.empty()) {
            int ans = thres;//thres就是分析中的t
            ++thres;
            return ans;
        }
        int ans = *s.begin();
        s.erase(s.begin());
        return ans;
    }
    
    void addBack(int num) {
        if (num < thres) {
            s.insert(num);
        }
    }
private:
    int thres = 1;
    set<int> s;//s就是分析中的a集合
};
相关文章
|
Ruby
Elixir语言
Elixir 是一个基于Erlang VM的函数式元编程语言(类似Ruby),通过动态语言的灵活的语法和宏能够利用Erlang建立一个并发 分布 失败冗余的高质量代码
1757 0
|
2天前
|
云安全 人工智能 自然语言处理
|
9天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
666 56
Meta SAM3开源:让图像分割,听懂你的话
|
6天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
321 116
|
6天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
|
21天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
448 32

热门文章

最新文章