题目重点:多篇 Airbnb Coding 面经反复出现两房源拆住;用前缀/后缀连续覆盖求所有有序组合,并指出集合并集的误判。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 把日期规范成离散入住日,训练版 [start,end] 两端都包含;实际 check-in/check-out 若是半开区间需先转换。
- 两段都至少一天,第一套 A 覆盖 start..s,第二套 B 覆盖 s+1..end,A 与 B 不同;返回有序 (A,B),多个可行分割点只输出一次。
- 若其中一套也能覆盖整段,只要两套能实际贡献非空连续段仍返回; 的候选代码会排除这类 pair,真实面试是否只推荐‘必需拆住’须先问。
解题路线
- 先对每套房源把可住日去重成 set,并限制到请求范围;计算 prefixEnd[A]:从 start 起连续可住到哪一天,若首日不可住则为 start−1。
- 计算 suffixStart[B]:向左从 end 起连续可住到哪一天,若末日不可住则为 end+1。
- 对每个有序且不同的 A,B,需要存在分割日 s:s∈[start,end−1]、s≤prefixEnd[A]、s+1≥suffixStart[B]。故可行当 max(start,suffixStart[B]−1) ≤ min(end−1,prefixEnd[A])。
- 按输入房源顺序枚举 pair,把满足条件者输出;来源示例只有 B 能覆盖 3..6,C 能覆盖 7..11,因此 (B,C) 可行。
- 正确性:可行不等式给出一个 s,使第一套已覆盖的起始前缀和第二套已覆盖的结尾后缀相接;反过来任一合法 split 的 s 必落在两者交集。
手动走一遍
题目 A=[1,2,3,6,7,10,11]、B=[3,4,5,6,8,9,10,13]、C=[7,8,9,10,11],请求 [3,11]。B 的连续前缀到 6,C 的连续后缀从 7,选 s=6 得 (B,C)。A∪C 虽可能覆盖很多日期,但 A 在 4/5 有洞,不能承担 3 起连续前段。
规模与取舍
n 套房源、行程 D 天,预处理前/后缀 O(nD),枚举全部有序 pair O(n²),总 O(nD+n²) 时间;可住日集合占 O(M),M 为输入日期数,额外 O(n) 指标与最多 O(n²) 输出。若要输出每个 split 点,输出规模另乘 D。
易错点与追问
容易失分的边界
- 只要两套可住日并集覆盖整个区间就判可行,可能需要 A→B→A 来回跳。
- 把多个分割点当不同结果重复返回同一有序 pair。
- 只枚举无序组合,漏掉相反方向可能有不同可行性。
- 未确认闭区间/退房日口径。
- 把题目候选代码排除单套覆盖的逻辑当作已确认题意。
继续深挖
- 若只返回必需拆住的组合,要排除哪些 pair?
- 如何同时返回最早/最晚可行分割点?
- 房源可用日持续更新时如何维护前/后缀?
- 如果最多住三套且每次必须至少一晚怎么办?
