题目
给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。
每个矩形由其 左下 顶点和 右上 顶点坐标表示:
- 第一个矩形由其左下顶点
(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
题解
解题思路
要算出两个矩形覆盖的总面积,实际上我们只需要算出两个矩形的面积之和,再减去重叠的面积即可。
由于已经给出了矩形的 左下 顶点和 右上 顶点坐标,所以很容易可以求得矩形的面积,关键在于求重叠部分的面积。
对于重叠部分的长,实际上只需用 min(ax2, bx2) 减去 max(ax1, bx1) 即可得出;
对于重叠部分的宽,实际上只需用 min(ay2, by2) 减去 max(ay1, by1) 即可得出;
需要注意的是,由于两个矩形有可能是不重叠的,所以算出来的长或宽有可能是小于等于 0 的,这种情况重叠面积为 0。
代码
class Solution {
public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
// 计算 第一个矩形的面积
int area1 = (ax2 - ax1) * (ay2 - ay1);
// 计算 第二个矩形的面积
int area2 = (bx2 - bx1) * (by2 - by1);
// 计算重叠面积大小
// 重叠区域长度
int a = Math.max(Math.min(ax2, bx2) - Math.max(ax1, bx1), 0);
// 重叠区域宽度
int b = Math.max(Math.min(ay2, by2) - Math.max(ay1, by1), 0);
int area3 = a * b;
int ans = area1 + area2 - area3;
return ans;
}
}
复杂度分析
-
时间复杂度:O(1)
-
空间复杂度:O(1)
优质项目推荐
推荐一个可用于练手、毕业设计参考、增加简历亮点的项目。
lemon-puls/txing-oj-backend: Txing 在线编程学习平台,集在线做题、编程竞赛、即时通讯、文章创作、视频教程、技术论坛为一体
公众号
有兴趣可以关注公众号一起学习更多的干货哈!