1. 问题描述:
在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。每个矩形由其左下顶点和右上顶点坐标表示,如图所示:
示例:
输入: -3, 0, 3, 4, 0, -1, 9, 2 输出: 45
说明: 假设矩形面积不会超出 int 的范围。
2. 思路分析:
① 根据题目我们知道计算矩形总的面积分为两种情况进行计算,第一种情况是两个矩形没有重叠的情况,第二种情况是存在重叠的情况,对于没有重叠的情况直接坐标相减然后将两部分面积相加即可,对于存在重叠的情况需要画出具体的图来分析,总结出具体的几何关系即可
② 具有重叠部分的图如下:
③ 我们其实可以计算两个矩形的面积和然后减去两个矩形交集的面积,主要是计算两个矩形交集的面积,实际上是将矩形的线段投影在坐标轴上求解线段的交集即可,可以参照这一篇博客
3. 代码如下:
import java.util.Scanner;
public class Solution {
public static int computeArea(int A, int B, int C, int D, int E, int F, int G, int H){
/*未重叠部分*/
int total = (C - A) * (D - B) + (G - E) * (H - F);
if (H <= B || C <= E || G <= A || D <= F) return total;
/*重叠部分*/
int downX = Math.max(A, E);
int upX = Math.min(G, C);
int downY = Math.max(B, F);
int upY = Math.min(D, H);
return total - (upX - downX) * (upY - downY);
}
}
计算两个矩形的面积和减去两个矩形的交集:
from typing import List
class Solution:
def computeArea(self, A: int, B: int, C: int, D: int, E: int, F: int, G: int, H: int) -> int:
x = max(0, min(C, G) - max(A, E))
y = max(0, min(D, H) - max(B, F))
return (A - C) * (B - D) + (G - E) * (H - F) - x * y