SDE / Intern · Coding / OA

Amazon Meeting Rooms I:一个人能否参加全部会议?

排序检查相邻区间,固定半开边界,说明零时长与时区输入的处理。

题目重点:排序检查相邻区间,固定半开边界,说明零时长与时区输入的处理。

题意与假设

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

  • 会议为半开区间[start,end),start<end,时间统一为可比较整数。
  • 时间相同结束与开始不冲突;不含换场交通缓冲、取消与重复会议信息。

解题路线

  1. 按start排序,只需比较每个会议与前一个:前end>当前start则冲突;相等不冲突。遇到冲突立即返回false。
  2. 为什么相邻足够:若全部相邻无冲突,前一end≤下一start≤下一end,沿序列传递可证明所有更早会议结束不晚于当前start;任意不相邻冲突必导致某对相邻不合法。
  3. 实际日历先解析时区与夏令时为统一时间轴,不以本地字符串直接排序;产品若有通勤缓冲,应扩展占用时间再检查。
  4. 零时长会议是否占资源须问清,训练直接拒绝,避免半开空集与事件计数出现不同解释。

手动走一遍

训练[[1,3],[3,5]]可全部参加;[[1,4],[3,5]]不可;空会议列表可。

Python 参考实现

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

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

def can_attend(meetings):
    """Half-open [start,end), positive duration."""
    if any(start >= end for start,end in meetings):
        raise ValueError("positive-duration meetings required")
    ordered=sorted(meetings)
    return all(ordered[i-1][1] <= ordered[i][0] for i in range(1,len(ordered)))

复杂度

O(n log n)时间,排序示例O(n)额外空间;已按start排序则O(n)扫描。

易错点与追问

容易失分的边界

  • end==start也判冲突。
  • 只看原输入相邻而不排序。
  • 未核时区就比较字符串。

继续深挖

  • 要输出一对冲突会议?
  • 会议含交通缓冲怎么改?
  • 在线插入时仅检查哪些邻居?
✓已复制微信号!