223. 矩形面积 Python


一、题目描述

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

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

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

提示:-10^4 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 10^4

二、代码

代码如下:

class Solution:
    def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:
        # 左下(ax1,ay1) 右上(ax2,ay2)
        # 左下(bx1,by1) 右上(bx2,by2)
        M = (ax2 - ax1)*(ay2 - ay1) + (bx2 - bx1)*(by2 - by1)
        print("max:", M)
        # 判断是否有重叠部分
        if ax1 > bx2 or bx1 > ax2 or ay1 > by2 or by1 > ay2:
            print(M)
            return M  # 没有重叠部分
        else:
            # 选取重叠部分的坐标(左下角和右上角坐标)
            # overlap_x1:这是重叠部分的左下角 x 坐标。选择较大的 x 值是为了确保左下角的 x 坐标位于重叠区域内。
            # overlap_y1:这是重叠部分的左下角 y 坐标。选择较大的 y 值是为了确保左下角的 y 坐标位于重叠区域内。
            # overlap_x2:这是重叠部分的右上角 x 坐标。选择较小的 x 值是为了确保右上角的 x 坐标位于重叠区域内。
            # overlap_y2:这是重叠部分的右上角 y 坐标。选择较小的 y 值是为了确保右上角的 y 坐标位于重叠区域内。
            overlap_x1 = max(ax1, bx1)
            overlap_y1 = max(ay1, by1)
            overlap_x2 = min(ax2, bx2)
            overlap_y2 = min(ay2, by2)

            overlap_width = overlap_x2 - overlap_x1
            overlap_height = overlap_y2 - overlap_y1

            print(M - overlap_width * overlap_height)
            return M - overlap_width * overlap_height

三、解题思路

本题解题思路是判断2个矩形是否有重叠部分,通过判断矩阵左下角和右上角的坐标来分析矩阵是否存在重叠,由于重叠的方式有多种,所以判断其不重叠的情况要比判断重叠时的情况方便,通过a矩形左下角坐标与b矩形右上角坐标进行判断能够快速知道不重叠时的情况。
如果不重叠,则最大面积则是2个矩形面积相加;
如果重叠了,则需要单独判断重叠部分矩形的左下角坐标和右上角坐标,坐标的选取要符合在重叠区域内的条件。最后单独计算出重叠矩阵的大小,最大面积为2个矩形面积相加后减去该重叠矩阵面积。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值