
实现一个SmallestInfiniteSet类(后面用set简称),满足以下功能:
初始化时,set含有所有的正整数。
pop函数返回set中最小的整数。
add函数在set中添加一个整数。
思路:
set具有以下的功能:
可以取出最小的数字。
可以查找存不存在某数字。
添加数字,删除数字。
初始化时set包含所有的正整数,所有的可不是一个小数目,要全部保存的话耗时耗空间。
但是,可以看到题目中的限制条件,1 <= num <= 1000.
这就好办很多,最多就是在set中保存1~1000的数字。
可以用一个优先队列保存1~1000,剩下的操作都在优先队列中进行。
这里用一个boolean数组表示数字是否存在于set中。
并用minNum记录最小的数字。
每次调用pop函数,minNum都会更新到没有被删除的最小的整数。
add函数只需更改boolean的flag.
class SmallestInfiniteSet {
int minNum = 1;
boolean[] deleted = new boolean[1001]; //1 <= num <= 1000
public SmallestInfiniteSet() {
}
public int popSmallest() {
while(deleted[minNum]) minNum++;
int num = minNum;
minNum ++;
deleted[num] = true;
return num;
}
public void addBack(int num) {
deleted[num] = false;
if(num < minNum) minNum = num;
}
}
该文章介绍了一个名为SmallestInfiniteSet的类,该类使用一个优先队列和boolean数组来管理1到1000的正整数集合。初始化时包含所有正整数,pop函数返回并移除最小的数,add函数用于添加数字。通过维护一个deleted数组记录数字是否存在,以及minNum变量跟踪最小值。
1121

被折叠的 条评论
为什么被折叠?



