Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

矩形面积

来源Leetcode第223题矩形面积

二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。

每个矩形由其左下顶点和右上顶点坐标表示,如图所示。

Rectangle Area

示例:

1
2
输入: -3, 0, 3, 4, 0, -1, 9, 2
输出: 45

说明: 假设矩形面积不会超出 int 的范围。


把两个矩形叫做 A 和 B,不重叠就有四种情况,A 在 B 左边,A 在 B 右边,A 在 B 上边,A 在 B 下边。

判断上边的四种情况也很简单,比如判断 A 是否在 B 左边,只需要判断 A 的最右边的坐标是否小于 B 的最左边的坐标即可。其他情况类似。

此时矩形覆盖的面积就是两个矩形的面积和。

接下来考虑有重叠的情况。

此时我们只要求出重叠形成的矩形的面积,然后用两个矩形的面积减去重叠矩形的面积就是两个矩形覆盖的面积了。

而求重叠矩形的面积也很简单,我们只需要确认重叠矩形的四条边即可,可以结合题目的图想。

左边只需选择两个矩形的两条左边靠右的那条。

上边只需选择两个矩形的两条上边靠下的那条。

右边只需选择两个矩形的两条右边靠左的那条。

下边只需选择两个矩形的两条下边靠上的那条。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
//求第一个矩形的面积
int len1_1 = C - A; //长
int len1_2 = D - B; //高
int s1 = len1_1 * len1_2; //面积

//求第二个矩形面积
int len2_1 = G - E;
int len2_2 = H - F;
int s2 = len2_1 * len2_2;

if(E >= C || G <= A || F >= D || H <=B)
return s1 + s2; //没有重叠

int cover_x = Math.max(A,E);
int cover_x2 = Math.min(C,G);
int len = cover_x2 - cover_x; //重叠在x轴的边长

int cover_y = Math.min(D,H);
int cover_y2 = Math.max(F,B);
int len_2 = cover_y - cover_y2;

int cover_s = len * len_2;
return s1 + s2 - cover_s;
}