LeetCode //C - 2336. Smallest Number in Infinite Set

2336. Smallest Number in Infinite Set

You have a set which contains all positive integers [1, 2, 3, 4, 5, ...].

Implement the SmallestInfiniteSet class:

  • SmallestInfiniteSet() Initializes the SmallestInfiniteSet object to contain all positive integers.
  • int popSmallest() Removes and returns the smallest integer contained in the infinite set.
  • void addBack(int num) Adds a positive integer num back into the infinite set, if it is not already in the infinite set.
Example 1:

Input:

"SmallestInfiniteSet", "addBack", "popSmallest", "popSmallest", "popSmallest", "addBack", "popSmallest", "popSmallest", "popSmallest"

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

Output:

null, null, 1, 2, 3, null, 1, 4, 5

Explanation

SmallestInfiniteSet smallestInfiniteSet = new SmallestInfiniteSet();

smallestInfiniteSet.addBack(2); // 2 is already in the set, so no change is made.

smallestInfiniteSet.popSmallest(); // return 1, since 1 is the smallest number, and remove it from the set.

smallestInfiniteSet.popSmallest(); // return 2, and remove it from the set.

smallestInfiniteSet.popSmallest(); // return 3, and remove it from the set.

smallestInfiniteSet.addBack(1); // 1 is added back to the set.

smallestInfiniteSet.popSmallest(); // return 1, since 1 was added back to the set and

// is the smallest number, and remove it from the set.

smallestInfiniteSet.popSmallest(); // return 4, and remove it from the set.

smallestInfiniteSet.popSmallest(); // return 5, and remove it from the set.

Constraints:
  • 1 <= num <= 1000
  • At most 1000 calls will be made in total to popSmallest and addBack.

From: LeetCode

Link: 2336. Smallest Number in Infinite Set


Solution:

Ideas:

To implement the SmallestInfiniteSet in C, we need to maintain a data structure that allows us to efficiently find and remove the smallest number, as well as add numbers back to the set. A good choice for this task is a min-heap. However, since the numbers are from 1 to 1000 and we need to check if a number is already in the set, we can optimize this by using an array of booleans to keep track of which numbers are currently in the set.

The structure can have an integer to track the current smallest number and a boolean array to check if a number is in the set or has been removed. When popping the smallest number, we update the current smallest number to the next number that is present in the set. When adding a number back, we just update the boolean array.

Code:
c 复制代码
#define MAX_NUM 1000

typedef struct {
    int nextSmallest;
    bool present[MAX_NUM + 1];  // to track whether a number is in the set
} SmallestInfiniteSet;

SmallestInfiniteSet* smallestInfiniteSetCreate() {
    SmallestInfiniteSet* obj = malloc(sizeof(SmallestInfiniteSet));
    obj->nextSmallest = 1;
    for (int i = 1; i <= MAX_NUM; ++i) {
        obj->present[i] = true;
    }
    return obj;
}

int smallestInfiniteSetPopSmallest(SmallestInfiniteSet* obj) {
    int smallest = obj->nextSmallest;
    obj->present[smallest] = false;

    // Find the next smallest number
    while (obj->nextSmallest <= MAX_NUM && !obj->present[obj->nextSmallest]) {
        obj->nextSmallest++;
    }

    return smallest;
}

void smallestInfiniteSetAddBack(SmallestInfiniteSet* obj, int num) {
    if (!obj->present[num]) {
        obj->present[num] = true;
        if (num < obj->nextSmallest) {
            obj->nextSmallest = num;
        }
    }
}

void smallestInfiniteSetFree(SmallestInfiniteSet* obj) {
    free(obj);
}

/**
 * Your SmallestInfiniteSet struct will be instantiated and called as such:
 * SmallestInfiniteSet* obj = smallestInfiniteSetCreate();
 * int param_1 = smallestInfiniteSetPopSmallest(obj);
 * smallestInfiniteSetAddBack(obj, num);
 * smallestInfiniteSetFree(obj);
 */
相关推荐
田里的水稻5 分钟前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦13 分钟前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Florence2317 分钟前
计算机组成原理:GPU架构、并行计算、内存层次结构等
c语言
Jayden_Ruan1 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法
不吃鱼的羊1 小时前
启动文件Startup_vle.c
c语言·开发语言
点云SLAM2 小时前
C++ 常见面试题汇总
java·开发语言·c++·算法·面试·内存管理
叙白冲冲2 小时前
哈希算法以及面试答法
算法·面试·哈希算法
YuTaoShao3 小时前
【LeetCode 每日一题】1277. 统计全为 1 的正方形子矩阵
算法·leetcode·矩阵
古译汉书3 小时前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法
野犬寒鸦3 小时前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode