题目重点:题目同时写 LC939 和 Maximum Area Rectangle;训练版按 LC939 的最小轴对齐矩形解法实现,并公开最大/最小目标待核。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版给整数点集,寻找四角都存在、边平行坐标轴且正面积的矩形;返回最小面积,无矩形返回 0。
- 重复点按同一坐标去重;题目未明确点数上界或重复点约定。
- 若原题实际要最大面积,只需把枚举后的 min 改 max,但结果语义完全不同,应先确认。
解题路线
- 将全部点放入哈希集合以预期 O(1) 查询。枚举两点作为对角线,要求 x1≠x2 且 y1≠y2。
- 另外两角必是 (x1,y2) 与 (x2,y1)。集合中都存在时形成轴对齐矩形,面积为 |x2−x1|×|y2−y1|;更新最小正面积。
- 点对枚举 O(n²),比四点穷举 O(n⁴) 更直接;若点分组按列/行,亦可用列间共同 y 的组合实现另一种时间/空间取舍。
- 题目‘Maximum’与 LC939 编号冲突,文章标题与代码都不隐藏它。
手动走一遍
点 (0,0),(0,2),(3,0),(3,2) 构成面积 6 的唯一矩形,最小/最大相同;若再加入 (1,0),(1,2),则有面积 2、4、6,最小目标返回 2,最大目标返回 6,能用于现场确认。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
from collections.abc import Iterable
def min_rectangle_area(points: Iterable[tuple[int, int]]) -> int:
"""Smallest positive-area axis-aligned rectangle whose four corners exist."""
point_set = set(points)
unique = list(point_set)
best = None
for i, (x1, y1) in enumerate(unique):
for x2, y2 in unique[i + 1:]:
if x1 == x2 or y1 == y2:
continue
if (x1, y2) in point_set and (x2, y1) in point_set:
area = abs(x2 - x1) * abs(y2 - y1)
best = area if best is None else min(best, area)
return 0 if best is None else best
if __name__ == '__main__':
assert min_rectangle_area([(0, 0), (0, 2), (3, 0), (3, 2)]) == 6
复杂度
n 个不同点,建集合 O(n) 预期,枚举 O(n²) 点对,额外 O(n) 空间。哈希最坏性能依语言实现;面积乘积在固定宽度语言需考虑溢出。
易错点与追问
容易失分的边界
- 未排除同 x/同 y 点对,得到面积 0。
- 只检查对角线而不检查另外两角。
- 把四点所有排列当不同矩形并误算次数;这里只求面积极值,重复枚举不改答案。
- 未经核对把 Maximum 文字或 LC939 编号一方当成唯一可信原题。
继续深挖
- 若实际目标是最大面积,代码和无解返回怎样改?
- 若矩形可旋转、边不必平行坐标轴,判定与复杂度怎样变化?
- 如果需要输出四角坐标,如何在并列面积时稳定选择?
