【算法思路记录】力扣2336

Problem: 2336. 无限集中的最小数字


"""
既然要求无限集,那么就不能存储拥有的数字,要考虑被移除的数字
既然不能存储拥有的数字,要获得最小整数就不能用优先队列进行。

那么,可以记录被移除的数字,最小整数从1开始,如果最小整数位于被删除的数字内,则不对其进行移除操作。

popSmallest方法移除最小整数,这也是唯一一个移除整数的方法。
addBack会使得最小整数产生变化,添加回来的数字可能会成为最小数字

"""

class SmallestInfiniteSet:

    def __init__(self):
        self.rm = set()
        self.min_num = 1

    def popSmallest(self) -> int:
        res = self.min_num
        self.rm.add(res) # 最小数字被删除
        # 寻找下一个没有移除的最小数字
        while self.min_num in self.rm:
            self.min_num += 1
        return res

    def addBack(self, num: int) -> None:
        # 如果新加入的数字小于当前最小数字,则更新最小数字
        if num < self.min_num:
            self.min_num = num
        # 将加回来的数字从被移除的名单中去除
        self.rm.discard(num)


# Your SmallestInfiniteSet object will be instantiated and called as such:
# obj = SmallestInfiniteSet()
# param_1 = obj.popSmallest()
# obj.addBack(num)

你可能感兴趣的:(算法,leetcode,python)