题目重点:二维网格一座炮塔、曼哈顿距离 k 覆盖 house;穷举合法位置和房屋计数,再讨论批量加速。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版只在空地格放炮塔,房屋不能放塔,保护条件为 |r−hr|+|c−hc|≤k,墙不遮挡。
- 若允许任意坐标/房屋格或存在遮挡,候选集合与距离定义都需改变。
解题路线
- 先收集所有 house 坐标与可放塔格;对每个候选位置统计距离≤k 的 house 数,取最大并保持稳定并列规则。
- 计算距离无需 BFS,因为题目明说 Manhattan 范围;若墙会遮挡则改为多源/逐塔最短路,并确认距离是否可绕墙。
- 若网格很大,可在旋转坐标 u=r+c、v=r−c 中把曼哈顿菱形变轴对齐正方形,使用二维前缀和/离线计数;但需处理坐标范围和稀疏内存。
- 空房屋、k=0、k 大于网格直径、无可放位置、多个最优位置分别测试。
手动走一遍
训练房屋在 (0,0)、(0,2)、(2,0),k=1,若 (0,1) 可放塔则覆盖前两栋;(1,0) 也覆盖两栋,并列按行列序选 (0,1)。这个例子是训练构造。
规模与取舍
P 个候选格、H 栋房屋的直接法 O(PH) 时间、O(P+H) 坐标空间;稠密旋转前缀可预处理后近 O(P+RC) 查询,但坐标域可能扩大。
易错点与追问
容易失分的边界
- 用欧氏半径替代曼哈顿。
- 假定墙会挡住保护却无题面依据。
- 没问可否在 house 上放炮塔。
- 只找房屋中心而漏空地最优点。
继续深挖
- 允许放多座炮塔如何避免重复覆盖?
- 房屋动态增删怎么维护?
- 障碍遮挡如何改变解法?
