首页 > 其他分享 >力扣---2336. 无限集中的最小数字

力扣---2336. 无限集中的最小数字

时间:2023-06-07 22:24:19浏览次数:38  
标签:count 力扣 2336 --- popSmallest num SmallestInfiniteSet 集合 smallestInfiniteSet

现有一个包含所有正整数的集合 [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 <= num <= 1000
最多调用 popSmallest 和 addBack 方法 共计 1000 次

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/smallest-number-in-infinite-set
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

由于集合长度时无限的,所以直接用一个列表啥的模拟是不现实的(虽然由于数据大小的限制,还是可以强行模拟,但这就变成面向测试用例编程了)。

由于每次都是获取最小的那个数。当没有新数据加入时,可以利用一个不断自增的变量 count 来模拟无限长度的集合。

当加入新数据时,可以考虑两点:
1. 新数据大于等于 count 时,不需要添加进无限长度的集合中(集合中不包含相同元素)
2. 新数据小于 count 时,可以使用一个优先队列来维护新数据,当优先队列为 null 时,则使得 count 自增。

class SmallestInfiniteSet {
    // 优先队列,维护所有小于当前 count 的新增数据。
    PriorityQueue<Integer> priorityQueue;
    // 哈希表,保证优先队列中的元素没有重复。
    Set<Integer> set;
    // 自增元素,动态模拟无限长的集合。
    int count = 1;

    public SmallestInfiniteSet () {
        this.priorityQueue = new PriorityQueue<>();
        this.set = new HashSet<>();
    }

    public int popSmallest () {
        // 优先队列为 null 时,直接从无限长的集合中获取最小值,即 count 的当前值即可。
        if (priorityQueue.isEmpty()) {
            return count++;
        }
        // 优先队列不为 null 时,意味着之前添加了小于当前无限长集合中最小值的元素,此时需要从这些元素中进行删除。
        else {
            int tem = priorityQueue.poll();
            // 保证优先队列中不包含相同元素。
            set.remove(tem);
            return tem;
        }
    }

    public void addBack (int num) {
        // 保证优先队列中的元素都是需要优先删除,且保证优先队列中不包含相同元素。
        if (num < count && !set.contains(num)) {
            priorityQueue.add(num);
            set.add(num);
        }
    }
}

 

标签:count,力扣,2336,---,popSmallest,num,SmallestInfiniteSet,集合,smallestInfiniteSet
From: https://www.cnblogs.com/allWu/p/17464750.html

相关文章

  • python读txt文档-多列
    有一个txt格式的文本文档,格式如下。有两行数据。3个字段,字段与字段直接使用tab键分割开。hello1world1hellothankyou1hello2world2hellothankyou2现在想通过python读取这个文件。分别读取到hello1,world1,和 hellothankyou1代码如下。withopen('......
  • hugp-MemE关键美化
    配置frontmatter使用vscodesnippet快捷生成frontmatter参考博客:vs-code-workflows-for-hugo、markdown-snippets-not-working-in-vscode在使用了obsidian后,加入一些插件如quickadd等,优化了文章撰写,但是obsidian不能在网页端登陆,虽然多个平台都有部署安装包,此外仅支持md文件......
  • simulink求微分方程dx =-5x + u
    一、分析题目,对dx积分才能求出x,可以通过引入积分器,其中积分器的输入是dx,输出就是x二、确定需要的模块,存在-5x,需要一个gain模块,有-5x+u需要一个sum模块,加上一步需要的积分器,此处这里的u用正弦信号,需要一个sinewave,查看信号情况,需要一个scope模块,需要观察两信号的叠加输出,输出一个......
  • Vulnhub: Mission-Pumpkin v1.0: PumpkinGarden靶机
    kali:192.168.111.111靶机:192.168.111.130信息收集端口扫描nmap-A-sC-v-sV-T5-p---script=http-enum192.168.111.130在1515网站的img目录下的hidden_secret/目录中存在clue.txtbase64解密后得到scarecrow:5Qn@$y使用用户:scarecrow,密码:5Qn@$y,登录目标sshsshs......
  • 分布式事务-CAP 和 BASE 理论以及几种方案
    一、为什么会有分布式事务#分布式系统经常出现的异常,如机器宕机、网络异常、消息丢失、数据错误、不可靠的TCP、存储数据丢失等等。二、分布式事务分布式事务是指事务的参与者,支持事务的服务器,资源服务器分别位于分布式系统的不同节点之上,通常一个分布式事物中会涉及到对多个数......
  • linux 脚本 if [ $? -ne 0 ];then
    在shell命令中,if[$?-ne0];then是一个条件语句,用于检查上一个命令的执行状态。$?是一个特殊变量,它包含了上一个命令的退出状态码。-ne是不等于的意思。退出状态码为0表示命令执行成功,非0表示命令执行失败或出现错误。因此,if[$?-ne0];then的意思是:如果上一个......
  • 【问题以及解决】vue和vue-router版本要对应
    遇到报错ERRORCannotreadpropertiesofundefined(reading'install')TypeError:Cannotreadpropertiesofundefined(reading'install')atVue.use(webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:5466:27)ateval(......
  • CSP-S 2021
    P7913[CSP-S2021]廊桥分配:让我们先忽略廊桥数量的限制来安排航班。我们维护一个空闲的廊桥队列,每到达一架航班,就给它安排编号最小的廊桥供其使用。现在加上廊桥数量的限制。容易发现刚才的廊桥分配方法直接就帮我们解决了廊桥限制的问题:如果当前有\(n\)个廊桥可供使用,则分......
  • CSP-S 2020
    日期计算以\(400\)年为周期,每\(400\)年都有恰好\(146097\)天。(\(146097=365\times400+100-4+1\))预处理出\(400\)年内的情况,将年份模\(400\)即可快速得到答案。几个简化代码的技巧:对于格里高利历,以\(1200\)年\(1\)月\(1\)日为起始日,\(r\)减去跳过的天数(\(2159351\))。(\(21593......
  • Linux-篇四
    组管理和权限管理基本介绍所有者、所在组、其他组、改变用户所在组文件/目录所有者一般文件的创建者就是该文件的所有者查看文件的所有者ll相当于ls-ahl修改文件的所有者文件/目录所在组当某个用户创建一个文件后,这个文件的所有组就是该用户所在的组(默认)修改文件/目录所在的组√......