LeetCode 223. 矩形面积

313 阅读2分钟

223. 矩形面积

难度 中等

题目

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。

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

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

示例

示例 1:

Rectangle Area

输入: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

提示:

  • -104 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 104

题解

分析

简单理解题意就是:给我们4个点,分别是两个矩形的两个对角顶点,我们需要算出两个矩形在平面上覆盖的总面积,两个矩形的排布主要有以下4中情况: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

(1)不相交

两个矩形不相交的情况有两种,因为输入的顶点是按顺序输入下顶点和上顶点,所以左右不相交的情况可以这样进行判断:(ax2 < bx1 || bx2 < ax1),上下不相交的情况可以这样进行判断:(by1 > ay2 || ay1 > by2)。这两种情况下两个矩形覆盖的总面积即为两个矩形的面积之和。

(2)相交或包含

在这里插入图片描述

如上图,我们给横坐标和纵坐标排了个序,横坐标从左到右分别为x1、x2、x3、x4,纵坐标从上到下分别为y1、y2、y3、y4,不难发现,两个矩形相交的面积坐标为x2、x3、y2、y3。让我们再来看看包含的情况:

在这里插入图片描述

不难看出,包含情况下的矩形亦如上文分析那样,我们只需要找出x2、x3、y2、y3就可以算出两个矩形相交部分的面积 ,再用总面积减去这部分的面积即为两个矩形覆盖的总面积。

代码

/**
 * @param {number} ax1
 * @param {number} ay1
 * @param {number} ax2
 * @param {number} ay2
 * @param {number} bx1
 * @param {number} by1
 * @param {number} bx2
 * @param {number} by2
 * @return {number}
 */
var computeArea = function (ax1, ay1, ax2, ay2, bx1, by1, bx2, by2) {
  const area = (ax2 - ax1) * (ay2 - ay1) + (bx2 - bx1) * (by2 - by1);
  if (ax2 < bx1 || bx2 < ax1) return area;
  if (by1 > ay2 || ay1 > by2) return area;
  let x = [ax1, ax2, bx1, bx2],
    y = [ay1, ay2, by1, by2];
  x = x.sort((a, b) => {
    return a - b;
  });
  y = y.sort((a, b) => {
    return a - b;
  });
  return area - (x[2] - x[1]) * (y[2] - y[1]);
};