SWE · VO Coding

Airbnb 房源连锁预订半径:单起点最大可达数

Onsite 把半径连锁触发包装成房源题;构造有向图,逐起点遍历并讨论距离、方向和重复触发。

题目重点:Onsite 把半径连锁触发包装成房源题;构造有向图,逐起点遍历并讨论距离、方向和重复触发。

题意与假设

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

  • 坐标和半径是有限非负整数,欧氏距离≤源房源半径才建 i→j;是否恰等边界题目未明。
  • 每套房源最多计数/触发一次;虽然可能有环,触发过程会停止。
  • 返回最大数量,不要求起点索引;空输入返回 0。

解题路线

  1. 对每对不同房源 i,j,若 (xi−xj)^2+(yi−yj)^2≤ri²,就建有向边 i→j。使用平方距离避免浮点根号误差。
  2. 以每个 i 作起点 DFS/BFS,用独立 visited 记录被触发集合,统计包括起点的可达数并取最大。
  3. 边有方向,因为 i 的半径与 j 的半径不同;图上路径表示链式触发,逐起点可达集合恰是最终被预订房源集合。
  4. 大规模可先求强连通分量并缩成 DAG,统一组件内起点可达范围,再做位集传播;若 n 小,直接逐起点搜索更简单。

手动走一遍

训练例:A=(1,2,r3)、B=(3,2,r1)、C=(4,2,r1):A 可触发 B(距离 2),B 可触发 C(距离 1),因此从 A 可订到 3 套;C 未必能反向触发 A。题目原坐标示例未给答案,本文例子只演示连锁。

规模与取舍

预建边 O(n²) 时间/最坏 O(n²) 空间;逐起点遍历 O(n(n+E)),稠密图最坏 O(n³)。若 n 很大,可用空间索引先筛附近房源,但最终还需保留有向语义。

易错点与追问

容易失分的边界

  • 把距离用目标房源半径判断。
  • 无向化边,错误允许反向触发。
  • 忘记 visited,在环上无限递归/重复计数。
  • 用浮点 sqrt 与边界比较引入误差。
  • 只统计直接邻居,漏连锁触发。

继续深挖

  • 怎样在大图上用 SCC 加速?
  • 坐标为浮点时如何稳定判边界?
  • 如果只能选 k 个起点最大覆盖怎么办?
  • 房源位置动态变化怎样更新图?
✓已复制微信号!