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 - overlapclass Solution {
public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
long areaA = (long) (ax2 - ax1) * (ay2 - ay1);
long areaB = (long) (bx2 - bx1) * (by2 - by1);
long w = (long) Math.min(ax2, bx2) - Math.max(ax1, bx1);
long h = (long) Math.min(ay2, by2) - Math.max(ay1, by1);
long overlap = Math.max(w, 0) * Math.max(h, 0);
return (int) (areaA + areaB - overlap);
}
}class Solution {
public:
int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
long long areaA = 1LL * (ax2 - ax1) * (ay2 - ay1);
long long areaB = 1LL * (bx2 - bx1) * (by2 - by1);
long long w = (long long)min(ax2, bx2) - max(ax1, bx1);
long long h = (long long)min(ay2, by2) - max(ay1, by1);
long long overlap = max(w, 0LL) * max(h, 0LL);
return (int)(areaA + areaB - overlap);
}
};func computeArea(ax1 int, ay1 int, ax2 int, ay2 int, bx1 int, by1 int, bx2 int, by2 int) int {
areaA := (ax2 - ax1) * (ay2 - ay1)
areaB := (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 areaA + areaB - overlap
}var computeArea = function(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2) {
const areaA = (ax2 - ax1) * (ay2 - ay1);
const areaB = (bx2 - bx1) * (by2 - by1);
const w = Math.min(ax2, bx2) - Math.max(ax1, bx1);
const h = Math.min(ay2, by2) - Math.max(ay1, by1);
const overlap = Math.max(w, 0) * Math.max(h, 0);
return areaA + areaB - overlap;
};function computeArea(ax1: number, ay1: number, ax2: number, ay2: number, bx1: number, by1: number, bx2: number, by2: number): number {
const areaA = (ax2 - ax1) * (ay2 - ay1);
const areaB = (bx2 - bx1) * (by2 - by1);
const w = Math.min(ax2, bx2) - Math.max(ax1, bx1);
const h = Math.min(ay2, by2) - Math.max(ay1, by1);
const overlap = Math.max(w, 0) * Math.max(h, 0);
return areaA + areaB - overlap;
}