题目

Find the total area covered by two rectilinear rectangles in a 2D plane.

Each rectangle is defined by its bottom left corner and top right corner as shown in the figure.

https://leetcode.com/static/images/problemset/rectangle_area.png

Assume that the total area is never beyond the maximum possible value of int.

大致意思

在x和y轴上,给出两个矩形,分别有边界上的四个点,求出在整个平面上,他们覆盖了多少的面积

解决方案

首先,我们先求出两个矩形各自的面积,然后进行相加

var sumArea = (C - A) * (D - B) + (G - E) * (H - F);

两个矩形在平面上,他们只有两种可能性,相交或者不相交。

  • 相交情况
    • 我们求出相交的顶点,求出相交的面积,再根据总面积相减,就得到了覆盖的总面积
    • 如何求出相交的点的坐标
      • 矩形A、B左上角的顶点,求出X的最小,右下角顶点X的最大
      • 矩形A、B左上角的顶点,求出Y的最小,右下角顶点Y的最大
        (Math.min(G, C) - max(A, E)) * (Math.min(D, H) - max(B, F))
        
  • 不相交情况
    • 因为不相加,所以,覆盖的面积就是两个矩形相加的和
    • 什么情况下会不相交
      • 矩形B的左下角X >= 矩形A右上角的X
      • 矩形B的左下角Y >= 矩形A右上角的Y
      • 矩形A的左下角X >= 矩形B右上角的X
      • 矩形A的左下角Y >= 矩形B右上角的Y
        if (E >= C || F >= D || B >= H || A >= G) return sumArea;
        

源代码

var computeArea = function(A, B, C, D, E, F, G, H) {
  var sumArea = (C - A) * (D - B) + (G - E) * (H - F);

  if (E >= C || F >= D || B >= H || A >= G) return sumArea;
  return sumArea - ((Math.min(G, C) - max(A, E)) * (Math.min(D, H) - max(B, F)));
};