无限集中的最小数字
难度:
标签:
题目描述
代码结果
运行时间: 68 ms, 内存: 17.0 MB
/*
* 题目思路:
* - 使用 Java Stream 和集合来管理整数集合。
* - 使用 TreeSet 保证集合内元素有序,并方便操作最小元素。
* - 使用过滤和排序操作实现 addBack 和 popSmallest 的功能。
*/
import java.util.Set;
import java.util.TreeSet;
public class SmallestInfiniteSet {
private TreeSet<Integer> set;
private int current;
public SmallestInfiniteSet() {
set = new TreeSet<>();
current = 1;
}
public int popSmallest() {
if (!set.isEmpty()) {
return set.pollFirst();
}
return current++;
}
public void addBack(int num) {
if (num < current) {
set.add(num);
}
}
}
解释
方法:
这个题解使用了一个整数val来记录当前未被移除的最小整数,以及一个最小堆lst来存储被重新加入的数字。初始化时,val设置为0,lst为空。当调用popSmallest()时,如果lst非空,则从lst中移除并返回最小元素;如果lst为空,则直接返回val并增加val。对于addBack(num),只有当num小于等于val且不在lst中时,才将num加入lst。这确保了所有被加回的数字都是之前被移除的数字。
时间复杂度:
O(log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在`SmallestInfiniteSet`类的构造函数中,`self.val`被初始化为0,而不是预期的1。这会如何影响`popSmallest`方法的行为和返回的结果?
▷🦆
对于`addBack`方法,为什么选择只在`num <= self.val`且`num`不在`lst`中时才添加`num`到`lst`?这样的条件判断有什么特定的目的吗?
▷🦆
在`popSmallest`方法中,当`lst`为空且直接返回`self.val`后增加`self.val`的值,这种操作是否能保证每次都返回集合中当前最小的整数?
▷🦆
题解提到使用最小堆来维护`lst`,这种数据结构选择对于`addBack`和`popSmallest`方法的效率有何影响?
▷