class SmallestInfiniteSet {
// 集合从未弹出元素的左边界
int noDelMin;
// 元素不重复,默认从小到大排序
TreeSet<Integer> set;
public SmallestInfiniteSet() {
noDelMin = 1;
set = new TreeSet<>();
}
public int popSmallest() {
// set中有元素,可能是未删除过元素,也可能是删除元素后又添加进set中
if (!set.isEmpty()) {
return set.pollFirst();
}
// set中无元素,说明从1~delMax都被弹出,且删除后未添加进集合中,此时最小整数就是delMax
int res = noDelMin;
noDelMin++;
return res;
}
public void addBack(int num) {
// num曾经被删除过又重新添加
if (num < noDelMin) {
set.add(num);
}
}
}