实现一个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;
}
}