美文网首页
【教3妹学编程-算法题】无限集中的最小数字

【教3妹学编程-算法题】无限集中的最小数字

作者: 程序员小2 | 来源:发表于2023-11-28 09:21 被阅读0次
    瑟瑟发抖

    3妹:好冷啊, 冻得瑟瑟发抖啦
    2哥 : 又一波寒潮来袭, 外面风吹的呼呼的。
    3妹:今天还有雨,2哥上班记得带伞。
    2哥 : 好的
    3妹:哼,不喜欢冬天,也不喜欢下雨天,要是我会咒语,一直停留在春天就好啦,四季如春。
    2哥:想得美, 接受现实吧。说到咒语,我今天看到一个关于咒语的题目,你来做一下吧~
    3妹:好的,我要上班去了,你发我微信上,我通勤路上看一下~

    吃瓜

    题目:

    现有一个包含所有正整数的集合 [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 次

    思路:

    思考

    有序集合,
    由于一开始类中包含所有正整数,并且操作要么添加任意的正整数,要么删除最小的正整数,因此我们可以期望,在任意时刻,存在一个正整数 ,使得所有大于等于 正整数均在类中。
    详解见代码:

    java代码:

    class SmallestInfiniteSet {
        Set<Integer> set = new HashSet();
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
        int n = 1; // n为非离散区间的起始位置
        public SmallestInfiniteSet() {
        }
        
        public int popSmallest() {
            if (set.isEmpty()) return n++;
            int res = pq.poll();
            set.remove(res);
            return res;
        }
        
        public void addBack(int num) {
            if (num < n && set.add(num)) pq.add(num);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:【教3妹学编程-算法题】无限集中的最小数字

          本文链接:https://www.haomeiwen.com/subject/wewtgdtx.html