LeetCode 223. 矩形面积

LeetCode 223. 矩形面积

来源:力扣(LeetCode)

【问题描述】

给你 二维 平面上两个 由直线构成的 矩形,请你计算并返回两个矩形覆盖的总面积。

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

第一个矩形由其左下顶点 (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

【数据范围】

-10e4 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 10e4

思路

显而易见(太明显了\狗头),两个矩形覆盖面积就是两个矩形的面积和减去重叠部分的面积和。
这里有两种情况,一直是有重叠部分,一种是没有重叠部分。

如何判断是否有重叠部分

先以一维线段为例:如图,在x轴上有一段(a1,b1)长度的线段
在这里插入图片描述
(a2,b2)长度线段要想不在(a1,b1)内,只有两种情况
在这里插入图片描述
-》得出结论,a2>b1 || b2<a1 时 ,线段(a2,b2)不在线段(a1,b1)内

所以我们来看这题,判断两个矩形是否有重叠部分,只需要从x方向和从y方向判断是否两个边没有相重叠的部分,如果没有就是不重叠。

如图1:
图1
设左边矩形的竖直边为l1,右边矩形的竖直边为l2。
l1取值范围(ay1,ay2),l2取值范围是(by1,by2)
判断l1有无在l2内:
(ay2<by1) || (ay1>by2)
判断l2有无在l1内:
(by2<ay1) || (by1>ay2)

同理判断水平方向有无重叠。

我们就有了判断有无重叠的方程,没有重叠直接返回面积就行。

那么计算重叠面积:

如法炮制,先以线段为例,

在这里插入图片描述可以看到,重合线段的左边界是两个线段左边界的更大值,重合线段的右边界是两个线段有边界的最小值。
也就是最后的结果(max(a1,a2),min(b1,b2) )

用此方法对上面的图1中l1,l2,可以求出重叠的部分长度:abs(max(ay1,by1)-min(a2,by2) )

综上,代码如下:

class Solution {
public:
    int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
        if( ( (ax2<bx1) || (ax1>bx2) ) || ( (ay2<by1) || (ay1>by2) ) ||
            ( (bx2<ax1) || (bx1>ax2) ) || ( (by2<ay1) || (by1>ay2) )//特判没有重叠的情况
        )
            return abs(ax2-ax1)*abs(ay2-ay1)+abs(bx2-bx1)*abs(by2-by1);//直接返回两个矩形面积和

        return abs(ax2-ax1)*abs(ay2-ay1)+abs(bx2-bx1)*abs(by2-by1)-        //两个矩形面积和
                abs(max(ax1,bx1)-min(ax2,bx2))*abs(max(ay1,by1)-min(ay2,by2));//重叠部分面积
    }
};

结果

在这里插入图片描述

本日记仅供学习交流,侵删

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值