You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定时间段为企业分配办公室的程序高效实现方法咨询

办公室租赁分配高效实现方案

结合你给出的约束条件(日期范围≤365天,办公室总数n≤1000),下面两种实现方案的性能和稳定性都远优于通用List存储方案:

方案1:差分数组实现(开发成本最低,完全满足约束要求)

  • 核心逻辑:利用日期范围固定的特性,给每间办公室单独维护一个长度为366的差分数组,标记租约的起止状态,判断区间是否可用只需快速计算前缀和即可。
  • 操作步骤:
    1. 初始化长度为n的数组,每个元素对应一间办公室的差分数组diff[366],初始值全为0
    2. 收到(startDate, endDate)的租赁请求时,按ID从小到大遍历每间办公室:
      • 基于当前办公室的差分数组计算前缀和,检查[startDate, endDate]区间内的所有值是否全为0(注意区间开闭要统一,避免相邻租约冲突判断错误,示例场景下用闭区间即可)
      • 找到第一间符合条件的办公室后,更新差分数组:diff[startDate] += 1,diff[endDate + 1] -= 1,直接返回审批通过
    3. 遍历完全部办公室都无符合条件的,返回驳回
  • 性能表现:单次请求最坏时间复杂度为O(n*365),n最大为1000的场景下单次请求最多36万次操作,完全满足日常业务需求,代码实现简单几乎无出错概率。

方案2:有序集合存储租约(适合租约量极大、查询频率极高的场景)

  • 核心逻辑:给每间办公室维护一个按租约起始日期排序的有序集合(如Java的TreeMap、Python的SortedDict),判断冲突只需两次二分查找,无需遍历整个日期区间。
  • 操作步骤:
    1. 初始化长度为n的有序集合数组,每个元素对应一间办公室的已生效租约,key为租约起始日期,value为租约结束日期
    2. 收到(startDate, endDate)的租赁请求时,按ID从小到大遍历每间办公室:
      • 查找当前办公室有序集合中,最后一个起始日期≤startDate的租约,如果存在且该租约的结束日期≥startDate,说明时间冲突
      • 再查找第一个起始日期≥startDate的租约,如果存在且该租约的起始日期≤endDate,说明时间冲突
      • 两个条件都不满足则当前办公室可用,直接将新租约插入有序集合,返回审批通过
    3. 遍历完全部办公室都无符合条件的,返回驳回
  • 性能表现:单次请求最坏时间复杂度为O(n*logk),k为单办公室的历史租约数量,性能比差分数组方案更高,适合后续业务扩展、办公室数量增加的场景。

和通用List实现的对比

如果用List全局存储所有历史租约,每次请求需要遍历所有租约统计每间办公室的占用情况,时间复杂度会随历史租约数量增长而上升,租约量大之后性能下降非常明显,上面两种方案都可以完全避免这个问题。

示例场景验证:2间办公室的场景下,按上述逻辑处理请求时,(0,2)分配1号、(0,4)分配2号、(5,6)分配1号、(4,5)检查时1号5日已被占用、2号4日仍在租期内,直接驳回、(6,8)分配1号,完全符合你给出的预期结果。

内容的提问来源于stack exchange,提问作者Mrnobody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:54:08