在问 · 算法题解

223. 矩形面积

题目描述

平面上有两个矩形,各自的边都平行于坐标轴。

第一个矩形的左下角是 (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

解释:两个矩形面积分别为 24 和 27,重叠部分为 3 × 2 = 6,总面积 24 + 27 - 6 = 45。

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

解释:两个矩形完全重合,面积就是 4 × 4 = 16。

数据范围

  • -10^4 <= ax1 <= ax2 <= 10^4
  • -10^4 <= ay1 <= ay2 <= 10^4
  • -10^4 <= bx1 <= bx2 <= 10^4
  • -10^4 <= by1 <= by2 <= 10^4

解题思路

容斥原理:总面积 = 面积 A + 面积 B - 重叠面积。重叠部分也是一个轴对齐矩形,它的宽是 x 方向两段区间的交集长度 min(ax2,bx2) - max(ax1,bx1),高同理;如果结果为负,说明不重叠,取 0。

为什么正确

x 和 y 两个方向的重叠是独立的,重叠面积 = x 方向重叠长度 × y 方向重叠长度。

复杂度分析

时间 O(1),空间 O(1)。

易错点

宽和高要分别对 0 取 max——如果先相乘再取 max,两个负数相乘会得到虚假的正重叠。C++/Java 中面积和差值可能超过 int,要用 long 计算。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:
        area_a = (ax2 - ax1) * (ay2 - ay1)
        area_b = (bx2 - bx1) * (by2 - by1)
        w = min(ax2, bx2) - max(ax1, bx1)
        h = min(ay2, by2) - max(ay1, by1)
        overlap = max(w, 0) * max(h, 0)
        return area_a + area_b - overlap

载入编辑器,自己跑一遍 →

数学 专题的其他题目

查看 数学 全部题目 →