来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rectangle-area
题目描述:
给你 二维 平面上两个 由直线构成的 矩形,请你计算并返回两个矩形覆盖的总面积。
每个矩形由其 左下 顶点和 右上 顶点坐标表示:
第一个矩形由其左下顶点 (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
题目分析:
- 知道矩形a,b的左下顶点,右上顶点坐标.使用(a2 - a1) * (b2 - b1)可求矩形面积
- 矩形有可能相交.
- 矩形a的面积加上矩形b的面积减去相交部分面积(如果相交).
- 相交矩形的左下坐标为矩形a,b左下坐标(x,y)的最大值,右上坐标为矩形a,b右上坐标的最小值.
思路:
- 计算矩形a,b的面积
- 计算相交矩形的左下,右上坐标
- 判断矩形a,b是否相交
-- 如果矩形a,b不相交,则矩形b的by2 <= ay1 || bx1 >= ax2 || bx2 <= ax1 || by1 >= ay2
代码实现:
class Solution {
public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
// 矩形a的面积.
int area_a = (ax2 - ax1) * (ay2 - ay1);
// 矩形b的面积.
int area_b = (bx2 - bx1) * (by2 - by1);
// 相交面积矩形左下角x坐标
int cx1 = Math.max(ax1, bx1);
// 相交面积矩形左下角y坐标
int cy1 = Math.max(ay1, by1);
// 相交面积矩形右上角x坐标
int cx2 = Math.min(ax2, bx2);
// 相交面积矩形右上角y坐标
int cy2 = Math.min(ay2, by2);
// 判断矩形a和矩形b是否相交.
if (by2 <= ay1 || bx1 >= ax2 || bx2 <= ax1 || by1 >= ay2) return area_a + area_b;
// 计算相交矩形面积
int area_c = (cx2 - cx1) * (cy2 - cy1);
// 返回结果.
return area_a + area_b - area_c;
}
}