SWE · Coding

最少会议室/租车数及分配:按开始时间复用已结束资源

每笔需求持续占一个资源,半开区间端点相接可以复用。

题目重点:每笔需求持续占一个资源,半开区间端点相接可以复用。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 每interval(start,end)满足start<end,全部必须接受;资源完全同质,不允许中途迁移。
  • 固定K时可能无法接受全部;是否可拒绝、最大接受数或优先客户未给,不能自动把本答案作为固定K的完整政策。

解题路线

  1. 按start排序,active最小堆存(end,id),开始前释放所有end≤start资源到freeID堆,取最小空闲ID,否则创建新资源。
  2. 需要新资源时全部已有资源都被同时占用,所以此时重叠数形成台数下界;算法只在必要时新建,达到全局最小。
  3. assignment按原输入index返回,处理同start用原顺序使结果确定。只求数时可扫事件或维护end堆;真正租车还有地点/车型等约束,未给时不掺入本模型。

手动走一遍

[1,3)、[2,4)、[3,5):第一/第三可同资源,第二另一资源,共2。固定K1时不能满足前两同时;明确返回不可行、拒绝策略或调度选择,不能悄悄创建第二台。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

from heapq import heappush,heappop


def allocate(intervals):
    if any(start>=end for start,end in intervals):raise ValueError("positive-duration half-open intervals required")
    active,free=[],[];created=0;assignment=[None]*len(intervals)
    for index,(start,end) in sorted(enumerate(intervals),key=lambda row:(row[1][0],row[0])):
        while active and active[0][0]<=start:
            _,car=heappop(active);heappush(free,car)
        if free:car=heappop(free)
        else:car=created;created+=1
        assignment[index]=car;heappush(active,(end,car))
    return created,assignment

复杂度

O(nlogn)时间/O(n)空间含两堆及结果;默认最小可用ID选择增加free堆成本。

易错点与追问

容易失分的边界

  • 结束等起点是否复用由端点合同决定。
  • 用最长会议/租期优先而不按开始处理不能应用重叠下界证明。

继续深挖

  • 不同车可用起始地点导致转场时间,怎样扩展匹配模型?
  • 允许拒绝但优化总利润时,为什么不是简单会议数问题?
✓已复制微信号!