题目描述
难度:中等
给你 二维 平面上两个 由直线构成的 矩形,请你计算并返回两个矩形覆盖的总面积。
每个矩形由其 左下 顶点和 右上 顶点坐标表示:
第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。
示例 1:
输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4,
bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
输出:45
示例 2:
输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2,
bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
输出:16
提示:
-104 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 104
题解分析
仔细读题,题目要求计算并返回两个矩形覆盖的总面积;也就是说当两个矩形的面积计算出来后,存在两种情况:
① 矩形不存在重叠情况,这种情况直接返回两个矩形面积之和 ;
② 矩形存在覆盖情况,需要考虑利用总面积减去被覆盖的面积;
理解清楚两种条件之后,可以分析一下示例 1 中的矩形图片,我们应该如何考虑不重叠的情况呢?
假设存在两个矩形,第一个矩形为 a ,第二个矩形为 b;
a 对应左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2),b 对应左下顶点 (bx1, by1) 和右上顶点 (bx2, by2);
可以思考,当存在矩形 a 的左边界 ax1 >= 矩形 b 的右边界 bx2 时,两个矩形不会重叠;当存在矩形 a 的右边界 ax2 <= 矩形 b 的左边界 bx1 时,两个矩形也不会重叠;
剩下的上边界和下边界也是如此,可以尝试独自分析一下;
第二种情况,存在重叠,此时看示例 1 的图片,对于位于重叠部分的矩形,其边界取的是 a 和 b 两个矩形中 左边界的最大值,右边界的最小值,上边界的最小值,下边界的最大值;
不妨带入其它重叠情况下重叠部分的矩形是否像这样取边界;带入后会发现,只要发生重叠,重叠部分矩形边界必然符合上述条件;
两种情况均分析理解后,就可结合条件解题;
解题代码
public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
int total = (ax2 - ax1) * (ay2 - ay1) + // 总面积计算
(bx2 - bx1) * (by2 - by1);
if(ax1 >= bx2 || ax2 <= bx1 ||
ay1 >= by2 || ay2 <= by1){ // 矩阵不重合
return total;
}else { // 矩阵重合
return total -
( (Math.min(ax2,bx2) - Math.max(ax1,bx1)) *
(Math.min(ay2,by2) - Math.max(ay1,by1)) );
} // 重叠部分矩形面积计算 右减左= 边长 * 高 =上减下
}
总结
最开始只知道求全部面积减去重叠面积,而重叠与不重叠的条件以及重叠部分的面积怎么计算始终想不出来,最后看了题解后才恍然大悟,还是得多刷题,题做少了,思想就混了。
岁月悠悠,衰微只及肌肤;热忱抛却,颓废必致灵魂