LeetCode第223题_矩形面积

LeetCode 第223题:矩形面积

题目描述

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

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

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

难度

中等

题目链接

点击在LeetCode中查看题目

示例

示例 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

解题思路

这道题的关键在于计算两个矩形的总面积,然后减去它们重叠的部分。总面积等于第一个矩形的面积加上第二个矩形的面积,再减去它们重叠部分的面积。

方法一:找出重叠区域

  1. 计算两个矩形各自的面积
  2. 判断两个矩形是否重叠
  3. 如果重叠,计算重叠部分的面积
  4. 总面积 = 矩形1面积 + 矩形2面积 - 重叠面积

如何判断两个矩形是否重叠?

  • 当一个矩形完全在另一个矩形的左侧、右侧、上方或下方时,它们不重叠
  • 反之,它们重叠

如果重叠,重叠区域也是一个矩形,其:

  • 左下顶点坐标为 (max(ax1, bx1), max(ay1, by1))
  • 右上顶点坐标为 (min(ax2, bx2), min(ay2, by2))

时间复杂度:O(1)
空间复杂度:O(1)

代码实现

C# 实现

public 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 overlapWidth = Math.Min(ax2, bx2) - Math.Max(ax1, bx1);
        int overlapHeight = Math.Min(ay2, by2) - Math.Max(ay1, by1);
        
        // 计算重叠面积 (如果没有重叠,宽度或高度为负数,此时重叠面积为0)
        int overlapArea = Math.Max(overlapWidth, 0) * Math.Max(overlapHeight, 0);
        
        // 返回总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
        return area1 + area2 - overlapArea;
    }
}

Python 实现

class Solution:
    def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:
        # 计算两个矩形的面积
        area1 = (ax2 - ax1) * (ay2 - ay1)
        area2 = (bx2 - bx1) * (by2 - by1)
        
        # 计算重叠部分的宽度和高度
        overlap_width = min(ax2, bx2) - max(ax1, bx1)
        overlap_height = min(ay2, by2) - max(ay1, by1)
        
        # 计算重叠面积 (如果没有重叠,宽度或高度为负数,此时重叠面积为0)
        overlap_area = max(overlap_width, 0) * max(overlap_height, 0)
        
        # 返回总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
        return area1 + area2 - overlap_area

C++ 实现

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 overlapWidth = min(ax2, bx2) - max(ax1, bx1);
        int overlapHeight = min(ay2, by2) - max(ay1, by1);
        
        // 计算重叠面积 (如果没有重叠,宽度或高度为负数,此时重叠面积为0)
        int overlapArea = max(overlapWidth, 0) * max(overlapHeight, 0);
        
        // 返回总面积 = 矩形1面积 + 矩形2面积 - 重叠面积
        return area1 + area2 - overlapArea;
    }
};

性能分析

各语言实现的性能对比:

实现语言执行用时内存消耗说明
C#72 ms25.2 MB标准实现,计算方式简单直接
Python44 ms16.3 MB执行速度较快,实现简洁
C++8 ms6.0 MB最优性能,无需额外内存分配

补充说明

代码亮点

  1. 使用Math.MaxMath.Min函数简化重叠区域的计算
  2. 处理无重叠情况,通过取最大值0来避免负数
  3. 直接使用面积公式,无需复杂的几何计算
  4. 代码简洁直观,易于理解和维护

优化方向

  1. 可以先判断是否有重叠区域,如果没有直接返回两个矩形面积之和
  2. 在极大数值情况下,可以考虑使用长整型避免整型溢出
  3. 代码已经是常数时间复杂度,难以进一步优化性能

解题难点

  1. 确定两个矩形是否重叠的判断条件
  2. 计算重叠区域坐标时需要正确使用max和min函数
  3. 处理边界情况,比如两个矩形刚好相邻但不重叠
  4. 理解矩形坐标表示方式(左下和右上顶点)

常见错误

  1. 错误计算重叠区域,例如使用错误的max/min方向
  2. 忘记处理没有重叠的情况,导致负数重叠面积
  3. 整数溢出,特别是在计算较大矩形面积时
  4. 错误理解坐标系统,混淆左下和右上坐标

相关题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值