SWE / Hiring Event · VO Round 3 Coding

Microsoft 点集矩形面积:LC939 编号与 Maximum 文字冲突

题目同时写 LC939 和 Maximum Area Rectangle;训练版按 LC939 的最小轴对齐矩形解法实现,并公开最大/最小目标待核。

题目重点:题目同时写 LC939 和 Maximum Area Rectangle;训练版按 LC939 的最小轴对齐矩形解法实现,并公开最大/最小目标待核。

题意与假设

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

  • 训练版给整数点集,寻找四角都存在、边平行坐标轴且正面积的矩形;返回最小面积,无矩形返回 0。
  • 重复点按同一坐标去重;题目未明确点数上界或重复点约定。
  • 若原题实际要最大面积,只需把枚举后的 min 改 max,但结果语义完全不同,应先确认。

解题路线

  1. 将全部点放入哈希集合以预期 O(1) 查询。枚举两点作为对角线,要求 x1≠x2 且 y1≠y2。
  2. 另外两角必是 (x1,y2) 与 (x2,y1)。集合中都存在时形成轴对齐矩形,面积为 |x2−x1|×|y2−y1|;更新最小正面积。
  3. 点对枚举 O(n²),比四点穷举 O(n⁴) 更直接;若点分组按列/行,亦可用列间共同 y 的组合实现另一种时间/空间取舍。
  4. 题目‘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 编号一方当成唯一可信原题。

继续深挖

  • 若实际目标是最大面积,代码和无解返回怎样改?
  • 若矩形可旋转、边不必平行坐标轴,判定与复杂度怎样变化?
  • 如果需要输出四角坐标,如何在并列面积时稳定选择?
✓已复制微信号!