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.
![Rectangle Area](https://leetcode.com/static/images/problemset/rectangle_area.png)
Assume that the total area is never beyond the maximum possible value of int.
Credits:
Special thanks to @mithmatt for adding this problem, creating the above image and all test cases.
class Solution {
public:
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int ans = (C- A) * (D - B) + (G - E) * (H - F);
if(C <= E || G <= A || D <= F || H <= B) return ans; //两矩形不相交
int x[4] = {A, C, E, G}; int y[4] = {B, D, F, H};
sort(x, x + 4); sort(y, y + 4);
return ans - (x[2] - x[1]) * (y[2] - y[1]); //分别取在x,y轴方向上相交线段的长度相乘即为重合部分面积。
}
};
对两矩形是否相交的判断及处理可以进一步简化,最终代码只需一行:
return (C-A) * (D-B) + (G-E) * (H-F) - max(0, min(G,C) - max(A,E)) * max(0, min(D,H) - max(B,F));
但提交后却在最后一组数据WA了。
原因在于该组case中 计算min(G, C) - max(A,E)时数据溢出。
故仅需修改成long long型,如下,即可顺利AC。
return (C-A) * (D-B) + (G-E) * (H-F) - max((long long)0, ((long long)min(G,C) - (long long) max(A,E))) * max((long long)0, (long long)(min(D,H) - max(B,F)));