博文中会简要介绍Leetcode P0223题目分析及解题思路。
“Rectangle Area”是一道比较简单的题目,要求我们求出两个矩形覆盖的面积。虽然这道题初看有点难度,但是如果分析出两个矩形重叠部分的计算方法,就迎刃而解了。
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.
首先我们必须看出,既然题目指出这两个矩形都是通过两个点来定位的,我们就可以排除矩形会倾斜摆放的可能,也就是说两个矩形一定是水平或者竖直的。
接着我们考虑两种情况,一是两个矩形不重叠,那么覆盖的面积就等于两个矩形的面积之和;二是两个矩形存在重叠,那么我们需要找出重叠部分的计算方法。
仔细观察重叠部分不难发现,重叠部分同样也是一个矩形。我们只需要知道长宽即可计算出其面积,而想要知道长宽我们只需要知道左右边界坐标以及上下边界的坐标即可。观察左右边界不难发现,左边界实际是两个矩形左边界中的较大者,右边界实际是两个矩形右边界中的较小者,同理可以得到上下边界。这样一来,我们就可以比较容易地计算出重叠面积了。
以下是Java的题解代码实现。
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), area2 = (G-E)*(H-F);
// if no overlapping
if (C <= E || G <= A || D <= F || H <= B)
return area1+area2;
int left = Math.max(A, E), right = Math.min(G, C);
int top = Math.min(D, H), bottom = Math.max(B, F);
int area3 = (right-left)*(top-bottom);
return area1+area2-area3;
}
}
以下是C++的题解代码实现。
class Solution {
public:
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
unsigned area1 = (C-A)*(D-B), area2 = (G-E)*(H-F);
// if no overlapping
if (C <= E || G <= A || D <= F || H <= B)
return area1+area2;
int left = max(A,E), right = min(G,C), top = min(D,H), bottom = max(B,F);
unsigned area3 = (right-left)*(top-bottom);
return area1+area2-area3;
}
};