题目
You have a set which contains all positive integers [1, 2, 3, 4, 5, …].
Implement the SmallestInfiniteSet class:
- SmallestInfiniteSet() Initializes the SmallestInfiniteSet object to contain all positive integers.
- int popSmallest() Removes and returns the smallest integer contained in the infinite set.
- void addBack(int num) Adds a positive integer num back into the infinite set, if it is not already in the infinite set.
解题思路
维护一个堆,存加入符合条件的数,并在一个set中存入同样的数,用来判断是否已经存在,如果堆里有元素,就pop堆里最小的
代码
class SmallestInfiniteSet:
def __init__(self):
self.cur = 1
self.addlist = []
self.addset = set()
def popSmallest(self) -> int:
if self.addlist:
ret = heapq.heappop(self.addlist)
self.addset.discard(ret)
else:
ret = self.cur
self.cur += 1
return ret
def addBack(self, num: int) -> None:
if num >= self.cur or num in self.addset:
return
heapq.heappush(self.addlist, num)
self.addset.add(num)