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
【数据范围】
-10e4 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 10e4
思路
显而易见(太明显了\狗头),两个矩形覆盖面积就是两个矩形的面积和减去重叠部分的面积和。
这里有两种情况,一直是有重叠部分,一种是没有重叠部分。
如何判断是否有重叠部分
先以一维线段为例:如图,在x轴上有一段(a1,b1)长度的线段
(a2,b2)长度线段要想不在(a1,b1)内,只有两种情况
-》得出结论,a2>b1 || b2<a1 时 ,线段(a2,b2)不在线段(a1,b1)内
所以我们来看这题,判断两个矩形是否有重叠部分,只需要从x方向和从y方向判断是否两个边没有相重叠的部分,如果没有就是不重叠。
如图1:
设左边矩形的竖直边为l1,右边矩形的竖直边为l2。
l1取值范围(ay1,ay2),l2取值范围是(by1,by2)
判断l1有无在l2内:
(ay2<by1) || (ay1>by2)
判断l2有无在l1内:
(by2<ay1) || (by1>ay2)
同理判断水平方向有无重叠。
我们就有了判断有无重叠的方程,没有重叠直接返回面积就行。
那么计算重叠面积:
如法炮制,先以线段为例,
可以看到,重合线段的左边界是两个线段左边界的更大值,重合线段的右边界是两个线段有边界的最小值。
也就是最后的结果(max(a1,a2),min(b1,b2) )
用此方法对上面的图1中l1,l2,可以求出重叠的部分长度:abs(max(ay1,by1)-min(a2,by2) )
综上,代码如下:
class Solution {
public:
int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
if( ( (ax2<bx1) || (ax1>bx2) ) || ( (ay2<by1) || (ay1>by2) ) ||
( (bx2<ax1) || (bx1>ax2) ) || ( (by2<ay1) || (by1>ay2) )//特判没有重叠的情况
)
return abs(ax2-ax1)*abs(ay2-ay1)+abs(bx2-bx1)*abs(by2-by1);//直接返回两个矩形面积和
return abs(ax2-ax1)*abs(ay2-ay1)+abs(bx2-bx1)*abs(by2-by1)- //两个矩形面积和
abs(max(ax1,bx1)-min(ax2,bx2))*abs(max(ay1,by1)-min(ay2,by2));//重叠部分面积
}
};
结果
本日记仅供学习交流,侵删