跳转至

223. 矩形面积

原题链接

题目描述

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。

每个矩形由其 左下 顶点和 右上 顶点坐标表示:

  • 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
  • 第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。

示例 1:

图片

1
2
输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
输出:45

示例 2:

1
2
输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
输出:16

提示:

  • \(-10^4\) \(≤\) \(ax1\) , \(ay1\) , \(ax2\) , \(ay2\) , \(bx1\) , \(by1\) , \(bx2\) , \(by2\) \(≤\) \(10^4\)

思路

观察图像,不难发现以下特征:

  • 矩形a的水平边在x轴上的投影为[ax1, ax2],垂直边在y轴投影为[ay1, ay2];
  • 矩形b的水平边在x轴上的投影为[bx1, bx2],垂直边在y轴投影为[by1, by2];
  • 若两矩阵重合,则重合矩形的水平边在x轴上的投影为[max(ax1, bx1), min(ax2, bx2)], 垂直边在y轴上的投影为[max(ay1, by1), min(ay2, by2)]
  • 若有重合矩形,答案即为两矩形面积和 - 重合矩形面积

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution {
public:
    int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
        // 两矩形面积和
        int tot = (ax2 - ax1) * (ay2 - ay1) + (bx2 - bx1) * (by2 - by1);

        // 重合矩形
        int x = min(ax2, bx2) - max(ax1, bx1);  // x轴处投影
        int y = min(ay2, by2) - max(ay1, by1);  // y轴处投影
        if (x > 0 && y > 0) tot -= x * y;   // 若存在重合矩形,tot减去一个重合矩形面积

        return tot;
    }
};
回到页面顶部