LeetCode 第223题:矩形面积
题目描述
给你 二维 平面上两个 由直线构成的 矩形,请你计算并返回两个矩形覆盖的总面积。
每个矩形由其 左下 顶点和 右上 顶点坐标表示:
- 第一个矩形由其左下顶点
(ax1, ay1)
和右上顶点(ax2, ay2)
定义。 - 第二个矩形由其左下顶点
(bx1, by1)
和右上顶点(bx2, by2)
定义。
难度
中等
题目链接
示例
示例 1:
输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
输出:45
示例 2:
输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
输出:16
提示
-10^4 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 10^4
解题思路
这道题的关键在于计算两个矩形的总面积,然后减去它们重叠的部分。总面积等于第一个矩形的面积加上第二个矩形的面积,再减去它们重叠部分的面积。
方法一:找出重叠区域
- 计算两个矩形各自的面积
- 判断两个矩形是否重叠
- 如果重叠,计算重叠部分的面积
- 总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
如何判断两个矩形是否重叠?
- 当一个矩形完全在另一个矩形的左侧、右侧、上方或下方时,它们不重叠
- 反之,它们重叠
如果重叠,重叠区域也是一个矩形,其:
- 左下顶点坐标为
(max(ax1, bx1), max(ay1, by1))
- 右上顶点坐标为
(min(ax2, bx2), min(ay2, by2))
时间复杂度:O(1)
空间复杂度:O(1)
代码实现
C# 实现
public class Solution {
public int ComputeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
// 计算两个矩形的面积
int area1 = (ax2 - ax1) * (ay2 - ay1);
int area2 = (bx2 - bx1) * (by2 - by1);
// 计算重叠部分的宽度和高度
int overlapWidth = Math.Min(ax2, bx2) - Math.Max(ax1, bx1);
int overlapHeight = Math.Min(ay2, by2) - Math.Max(ay1, by1);
// 计算重叠面积 (如果没有重叠,宽度或高度为负数,此时重叠面积为0)
int overlapArea = Math.Max(overlapWidth, 0) * Math.Max(overlapHeight, 0);
// 返回总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
return area1 + area2 - overlapArea;
}
}
Python 实现
class Solution:
def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:
# 计算两个矩形的面积
area1 = (ax2 - ax1) * (ay2 - ay1)
area2 = (bx2 - bx1) * (by2 - by1)
# 计算重叠部分的宽度和高度
overlap_width = min(ax2, bx2) - max(ax1, bx1)
overlap_height = min(ay2, by2) - max(ay1, by1)
# 计算重叠面积 (如果没有重叠,宽度或高度为负数,此时重叠面积为0)
overlap_area = max(overlap_width, 0) * max(overlap_height, 0)
# 返回总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
return area1 + area2 - overlap_area
C++ 实现
class Solution {
public:
int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
// 计算两个矩形的面积
int area1 = (ax2 - ax1) * (ay2 - ay1);
int area2 = (bx2 - bx1) * (by2 - by1);
// 计算重叠部分的宽度和高度
int overlapWidth = min(ax2, bx2) - max(ax1, bx1);
int overlapHeight = min(ay2, by2) - max(ay1, by1);
// 计算重叠面积 (如果没有重叠,宽度或高度为负数,此时重叠面积为0)
int overlapArea = max(overlapWidth, 0) * max(overlapHeight, 0);
// 返回总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
return area1 + area2 - overlapArea;
}
};
性能分析
各语言实现的性能对比:
实现语言 | 执行用时 | 内存消耗 | 说明 |
---|---|---|---|
C# | 72 ms | 25.2 MB | 标准实现,计算方式简单直接 |
Python | 44 ms | 16.3 MB | 执行速度较快,实现简洁 |
C++ | 8 ms | 6.0 MB | 最优性能,无需额外内存分配 |
补充说明
代码亮点
- 使用
Math.Max
和Math.Min
函数简化重叠区域的计算 - 处理无重叠情况,通过取最大值0来避免负数
- 直接使用面积公式,无需复杂的几何计算
- 代码简洁直观,易于理解和维护
优化方向
- 可以先判断是否有重叠区域,如果没有直接返回两个矩形面积之和
- 在极大数值情况下,可以考虑使用长整型避免整型溢出
- 代码已经是常数时间复杂度,难以进一步优化性能
解题难点
- 确定两个矩形是否重叠的判断条件
- 计算重叠区域坐标时需要正确使用max和min函数
- 处理边界情况,比如两个矩形刚好相邻但不重叠
- 理解矩形坐标表示方式(左下和右上顶点)
常见错误
- 错误计算重叠区域,例如使用错误的max/min方向
- 忘记处理没有重叠的情况,导致负数重叠面积
- 整数溢出,特别是在计算较大矩形面积时
- 错误理解坐标系统,混淆左下和右上坐标
相关题目
- 836. 矩形重叠 - 判断两个矩形是否重叠
- 850. 矩形面积 II - 计算多个矩形的总面积
- 1401. 圆和矩形是否有重叠 - 判断圆和矩形是否重叠
leetcode.cn/problems/rectangle-area-ii/) - 计算多个矩形的总面积 - 1401. 圆和矩形是否有重叠 - 判断圆和矩形是否重叠
- 1450. 在既定时间做作业的学生人数 - 类似的区间重叠问题