☰
矩形面积(LeetCode 223):两矩形覆盖总面积与容斥原理的几何数学解法(AlgoNote 题解)
2026/10/8 1:27:15 网站建设 项目流程
  • 教程
  • 文档
  • 知识库

【免费下载链接】AlgoNote

⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000+ 道「LeetCode 题目解析」,持续更新中!

项目地址:https://gitcode.com/gh_mirrors/le/AlgoNote
点击查看免费下载

本文基于「算法通关手册」AlgoNote 仓库中的 0223. 矩形面积题解 展开。题目属于「几何、数学」分类、难度中等,核心是用容斥原理把「两个矩形覆盖的总面积」拆解为「两矩形面积之和减去重叠部分面积」。读完本文,你将掌握如何用一维区间交集的方法在 O(1) 时间内求出二维矩形的重叠区域长宽,并能够直接迁移到矩形重叠判定(0836)、多矩形面积并(0850)等系列问题上。

一、题目描述与坐标约定

给定两个矩形的左下角、右上角坐标(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2):

  • (ax1, ay1)表示第一个矩形左下角坐标,(ax2, ay2)表示第一个矩形右上角坐标;
  • (bx1, by1)表示第二个矩形左下角坐标,(bx2, by2)表示第二个矩形右上角坐标。

要求:计算出两个矩形覆盖的总面积。

题目约定两个矩形的边均与坐标轴平行(axis-aligned),因此每个矩形都可以用其在 x 轴与 y 轴上的两条投影线段完整刻画:

  • 矩形 A 在 x 轴上的投影区间为(ax1, ax2),在 y 轴上的投影区间为(ay1, ay2);
  • 矩形 B 在 x 轴上的投影区间为(bx1, bx2),在 y 轴上的投影区间为(by1, by2)。

在仓库的题目索引 00_05_solutions_list.md 中,本题被标注为「几何、数学」标签、中等难度,完整题解位于 docs/solutions/0200-0299/rectangle-area.md。

二、解题思路:容斥原理分解总面积

两个矩形覆盖的总面积满足如下恒等式:

总面积 = 第一个矩形面积 + 第二个矩形面积 - 重叠部分面积

这是典型的容斥原理应用:先把两个矩形的面积直接相加,此时重叠区域被重复计算了一次,因此必须再减去一次重叠区域的面积。

具体分三步:

  1. 分别计算两个矩形的面积:矩形面积 = 宽 × 高 =(右上角 x - 左下角 x) × (右上角 y - 左下角 y);
  2. 求出相交部分的长、宽:重叠矩形的宽 = 两个矩形在 x 轴投影线段的交集长度,重叠矩形的高 = 两个矩形在 y 轴投影线段的交集长度;
  3. 计算重叠部分面积:overlap_width × overlap_height,若某个方向没有交集则重叠面积为 0。

2.1 核心技巧:把二维重叠退化为一维区间交集

矩形在 x 轴与 y 轴上的投影都是区间,两个轴对齐矩形的重叠区域之所以仍是矩形,是因为其 x 区间与 y 区间分别独立取交集。

两个区间[l1, r1]与[l2, r2]的交集长度为:

intersection_length = max(0, min(r1, r2) - max(l1, l2))
  • 当两个区间确实相交时,min(r1, r2) > max(l1, l2),差值为正,即为交集长度;
  • 当两个区间无交集(相离)或仅边界相触时,min(r1, r2) <= max(l1, l2),差值 ≤ 0,通过外层max(0, ...)把结果钳制为 0。

套用到矩形上:

overlap_width = max(0, min(ax2, bx2) - max(ax1, bx1)) overlap_height = max(0, min(ay2, by2) - max(ay1, by1))

这个「投影区间交集」的视角同样出现在仓库的另一道姊妹题 0836. 矩形重叠题解 中:判断两矩形是否重叠,只需检查min(rec1[2], rec2[2]) > max(rec1[0], rec2[0])(x 方向有交集)且min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])(y 方向有交集)同时成立即可。本 223 题正是把该「有无交集」的布尔判定升级为「交集长度是多少」的数值计算。

三、完整代码实现

仓库题解 docs/solutions/0200-0299/rectangle-area.md 给出的参考实现如下:

class Solution: def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int: area_a = (ax2 - ax1) * (ay2 - ay1) area_b = (bx2 - bx1) * (by2 - by1) overlap_width = max(0, min(ax2, bx2) - max(ax1, bx1)) overlap_height = max(0, min(ay2, by2) - max(ay1, by1)) area_overlap = overlap_width * overlap_height return area_a + area_b - area_overlap

3.1 逐行解读

代码行作用说明
area_a = (ax2 - ax1) * (ay2 - ay1)计算第一个矩形面积宽 = 右上角 x − 左下角 x,高 = 右上角 y − 左下角 y
area_b = (bx2 - bx1) * (by2 - by1)计算第二个矩形面积同上,套用第二个矩形的坐标
overlap_width = max(0, min(ax2, bx2) - max(ax1, bx1))求重叠宽度x 方向两投影区间的交集长度;不相交时为 0
overlap_height = max(0, min(ay2, by2) - max(ay1, by1))求重叠高度y 方向两投影区间的交集长度;不相交时为 0
area_overlap = overlap_width * overlap_height计算重叠面积宽或高任一为 0 时乘积为 0
return area_a + area_b - area_overlap容斥求和总面积 = 面积 A + 面积 B − 重叠面积

3.2 边界情况验证

  • 两矩形完全不相交:min(ax2, bx2) <= max(ax1, bx1)或min(ay2, by2) <= max(ay1, by1),此时overlap_width或overlap_height被钳制为 0,area_overlap = 0,返回area_a + area_b,符合预期;
  • 一个矩形完全包含另一个:交集区间长度恰等于较小矩形的宽和高,重叠面积等于较小矩形面积,总面积等于较大矩形面积;
  • 仅边界相触(共享一条边或一个顶点):相触方向交集长度为 0,重叠面积为 0,总面积仍为两矩形面积之和,符合题目对「覆盖面积」的通常定义(面积为零的重叠不计入重复覆盖)。

3.3 复杂度分析

  • 时间复杂度:O(1)。仅执行常数次算术运算与min/max比较,不随输入规模变化;
  • 空间复杂度:O(1)。只使用若干个局部变量,无额外数据结构。

四、思路延展:从两个矩形到矩形系列问题

本题的两条核心思想——「投影区间交集」与「容斥去重」——在仓库中可以延伸到更复杂的矩形几何系列题:

  1. 重叠判定(0836,简单):0836. 矩形重叠题解 把 223 题的overlap_width * overlap_height计算退化为布尔判断,仅需验证两个方向投影区间是否均有正交集;
  2. 多矩形面积并(0850,困难):0850. 矩形面积 II 题解 将两个矩形的容斥公式推广到任意多个矩形,由于重叠区域只能计算一次,需要借助「扫描线 + 动态开点线段树」对 y 方向区间进行覆盖计数,再按 x 方向逐段累加面积,返回对10^9 + 7取模的结果;
  3. 完美矩形(0391,困难):0391. 完美矩形题解 进一步要求判断一组小矩形能否无重叠、无缝隙地拼成一个大矩形,本质上是面积等式与顶点计数的组合验证。

从这两个矩形的简单容斥,到扫描线线段树求解面积并,再到完美矩形的顶点计数,可以看到「区间 + 容斥 + 扫描」构成了矩形几何问题的一条清晰进阶路径。读者在掌握本题 O(1) 解法后,可按上述顺序在 docs/solutions 目录下继续深入对应题解。

五、总结

LeetCode 223「矩形面积」是一道典型的「几何 + 数学」中等题:

  • 解题公式为总面积 = S(A) + S(B) − S(重叠),本质是容斥原理;
  • 重叠区域的宽与高可分别通过两个坐标轴方向上的一维区间交集长度求得,max(0, min(r1, r2) - max(l1, l2))是唯一需要掌握的子技巧;
  • 该技巧同时覆盖了「无重叠」「包含」「相触」等全部边界情况,无需任何特判;
  • 算法时间复杂度 O(1)、空间复杂度 O(1),属于面试中高频出现的「数学公式推导 + 边界处理」类题目。
  • 教程
  • 文档
  • 知识库

【免费下载链接】AlgoNote

⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000+ 道「LeetCode 题目解析」,持续更新中!

项目地址:https://gitcode.com/gh_mirrors/le/AlgoNote
点击查看免费下载
上一篇:Play Integrity Fix 终极指南:如何让Root设备重新获得Google认证
下一篇:2025容器存储新范式:WinFsp容器存储接口(CSI)实现指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询