一、题目描述
给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。
每个矩形由其 左下 顶点和 右上 顶点坐标表示:
第一个矩形由其左下顶点 (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
二、代码
代码如下:
class Solution:
def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:
# 左下(ax1,ay1) 右上(ax2,ay2)
# 左下(bx1,by1) 右上(bx2,by2)
M = (ax2 - ax1)*(ay2 - ay1) + (bx2 - bx1)*(by2 - by1)
print("max:", M)
# 判断是否有重叠部分
if ax1 > bx2 or bx1 > ax2 or ay1 > by2 or by1 > ay2:
print(M)
return M # 没有重叠部分
else:
# 选取重叠部分的坐标(左下角和右上角坐标)
# overlap_x1:这是重叠部分的左下角 x 坐标。选择较大的 x 值是为了确保左下角的 x 坐标位于重叠区域内。
# overlap_y1:这是重叠部分的左下角 y 坐标。选择较大的 y 值是为了确保左下角的 y 坐标位于重叠区域内。
# overlap_x2:这是重叠部分的右上角 x 坐标。选择较小的 x 值是为了确保右上角的 x 坐标位于重叠区域内。
# overlap_y2:这是重叠部分的右上角 y 坐标。选择较小的 y 值是为了确保右上角的 y 坐标位于重叠区域内。
overlap_x1 = max(ax1, bx1)
overlap_y1 = max(ay1, by1)
overlap_x2 = min(ax2, bx2)
overlap_y2 = min(ay2, by2)
overlap_width = overlap_x2 - overlap_x1
overlap_height = overlap_y2 - overlap_y1
print(M - overlap_width * overlap_height)
return M - overlap_width * overlap_height
三、解题思路
本题解题思路是判断2个矩形是否有重叠部分,通过判断矩阵左下角和右上角的坐标来分析矩阵是否存在重叠,由于重叠的方式有多种,所以判断其不重叠的情况要比判断重叠时的情况方便,通过a矩形左下角坐标与b矩形右上角坐标进行判断能够快速知道不重叠时的情况。
如果不重叠,则最大面积则是2个矩形面积相加;
如果重叠了,则需要单独判断重叠部分矩形的左下角坐标和右上角坐标,坐标的选取要符合在重叠区域内的条件。最后单独计算出重叠矩阵的大小,最大面积为2个矩形面积相加后减去该重叠矩阵面积。