1.题目描述
在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。
每个矩形由其左下顶点和右上顶点坐标表示,如图所示:
2.思路
只要把阴影部分的矩形面积求出来就行
无非是求交点的坐标呗
显然 x1 就是A和E中的较大值,x2是C和G中的较小值
问:当什么时候这个两个矩形没有交点呢?
答:肯定是x2<=x1的时候啊,阴影部分的矩形就不存在了,同理适用于纵坐标。
3.C++代码
注:最后一行是先减后加,是因为先加后减结果溢出
class Solution {
public:
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
{
int area1 = (C-A)*(D-B);
int area2 = (G-E)*(H-F);
int x1 = max(A,E); //x坐标的左临界值
int x2 = min(C,G); //右临界值
int y1 = max(B,F); // 纵坐标的下临界值
int y2 = min(D,H); // 上临界值
if(x1>=x2 || y1>= y2)
return area1+area2;
else
return area1-(y2-y1)*(x2-x1)+area2;
}
};
改进版本:
把最后四行简化
int w = max(x2-x1,0);
int h = max(y2-y1,0);
return area1-w*h+area2;
4.python代码
class Solution:
def computeArea(self, A: int, B: int, C: int, D: int, E: int, F: int, G: int, H: int) -> int:
area1 = (C-A)*(D-B)
area2 = (G-E)*(H-F)
x1 = max(A,E)
x2 = min(C,G)
y1 = max(B,F)
y2 = min(D,H)
if x1>=x2 or y1>= y2:
return area1+area2
else:
return area1-(y2-y1)*(x2-x1)+area2
简化:
w = max(x2-x1,0)
h = max(y2-y1,0)
return area1-w*h+area2