算法题分享 | 矩形面积

30 阅读2分钟

iPad壁纸🗓文字篇19_6_舞木子_来自小红书网页版.jpg

题目

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

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

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

示例 1:

Rectangle Area

输入: 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 在线编程学习平台,集在线做题、编程竞赛、即时通讯、文章创作、视频教程、技术论坛为一体

公众号

有兴趣可以关注公众号一起学习更多的干货哈!

扫码_搜索联合传播样式-白色版.png