题目重点:Onsite 把半径连锁触发包装成房源题;构造有向图,逐起点遍历并讨论距离、方向和重复触发。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 坐标和半径是有限非负整数,欧氏距离≤源房源半径才建 i→j;是否恰等边界题目未明。
- 每套房源最多计数/触发一次;虽然可能有环,触发过程会停止。
- 返回最大数量,不要求起点索引;空输入返回 0。
解题路线
- 对每对不同房源 i,j,若 (xi−xj)^2+(yi−yj)^2≤ri²,就建有向边 i→j。使用平方距离避免浮点根号误差。
- 以每个 i 作起点 DFS/BFS,用独立 visited 记录被触发集合,统计包括起点的可达数并取最大。
- 边有方向,因为 i 的半径与 j 的半径不同;图上路径表示链式触发,逐起点可达集合恰是最终被预订房源集合。
- 大规模可先求强连通分量并缩成 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 个起点最大覆盖怎么办?
- 房源位置动态变化怎样更新图?
