问题描述:
Find the total area covered by two rectilinear rectangles in a 2D plane.
Each rectangle is defined by its bottom left corner and top right corner as shown in the figure.
Example:(-3,0)(3,4)(0,-1)(9,2)
Answer:45
Assume that the total area is never beyond the maximum possible value of int.
思路:
观察图就知道,要求两个矩形的覆盖面积,可以用两个矩形面积相加再减去相交面积,所以重点是求相交面积。
相交面积由相交矩阵长和宽计算,都是由相应方向的线段相交部分组成。比如x轴方向,线段P(-3,3)和Q(0,9)相交部分是(0,3),求法是:用P的左端点与Q线段两点比较,得出中间端点M;用P的右端点与Q线段两点比较,得出中间端点N,M,N组成线段即为相交线段。求法中,P、Q可对称交换。
依此理一样可求y轴方向。
代码:
class Solution { public:int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {//中间数相减即为交叉线段长int x = abs(findMiddle(A, E, G) - findMiddle(C, E, G));int y = abs(findMiddle(B, F, H) - findMiddle(D, F, H));return (D-B) * (C-A) + (H-F) * (G-E) - x*y;}//下面不是标准的求三个数的中间数方法,因为在当前这个问题中,后两个数组成线段,必定前小后大。int findMiddle(int A, int B, int C){if (A <= B) return B;if (A > C) return C;else return A;} };