python-leetcode-无限集中的最小数字

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 以去重

解释:

  1. current_min 记录当前最小的未被取出的正整数,每次 popSmallest() 后递增。
  2. min_heap 是一个最小堆,存储被 addBack(num) 加回的数,保证 popSmallest() 取最小值。
  3. added_back 是一个集合,防止重复加入堆中。
  4. popSmallest():
    • 如果 min_heap 非空,取出堆中最小值;
    • 否则返回 current_min 并递增。
  5. addBack(num):
    • 仅当 num 小于 current_min 且不在 added_back 中时,才添加到 min_heap

这样,所有操作都能高效执行,popSmallest()addBack(num) 都是 O(logN) 复杂度。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值