2336. 无限集中的最小数字 - 力扣(LeetCode)



这是一个经典的数据结构问题,可以使用最小堆 (heap) 和 set 结合来高效地实现 SmallestInfiniteSet。
下面是 Python 的实现:
import heapq
class SmallestInfiniteSet:
def __init__(self):
self.current_min = 1 # 记录当前最小的未被取出的正整数
self.added_back = set() # 记录被加回的元素
self.min_heap = [] # 最小堆,维护被加回的元素
def popSmallest(self) -> int:
if self.min_heap: # 如果有被加回的元素
smallest = heapq.heappop(self.min_heap) # 从堆中取最小元素
self.added_back.remove(smallest) # 从 set 中移除
else:
smallest = self.current_min # 否则返回当前最小正整数
self.current_min += 1 # 递增当前最小正整数
return smallest
def addBack(self, num: int) -> None:
if num < self.current_min and num not in self.added_back:
heapq.heappush(self.min_heap, num) # 加入最小堆
self.added_back.add(num) # 加入 set 以去重
解释:
current_min记录当前最小的未被取出的正整数,每次popSmallest()后递增。min_heap是一个最小堆,存储被addBack(num)加回的数,保证popSmallest()取最小值。added_back是一个集合,防止重复加入堆中。popSmallest():- 如果
min_heap非空,取出堆中最小值; - 否则返回
current_min并递增。
- 如果
addBack(num):- 仅当
num小于current_min且不在added_back中时,才添加到min_heap。
- 仅当
这样,所有操作都能高效执行,popSmallest() 和 addBack(num) 都是 O(logN) 复杂度。
1035

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



