223. Rectangle Area
Description
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.

Example:
Input: A = -3, B = 0, C = 3, D = 4, E = 0, F = -1, G = 9, H = 2
Output: 45
Note:
Assume that the total area is never beyond the maximum possible value of int.
分析和方案
求的是两个长方形的面积的合,所以需要判断是否有重叠部分。
思路就是判断一个长方形的四个点,是否落在另一个长方形内,如果有则说明重叠了,需要在面积合中减去重叠面积。
/**
* @param {number} A
* @param {number} B
* @param {number} C
* @param {number} D
* @param {number} E
* @param {number} F
* @param {number} G
* @param {number} H
* @return {number}
*/
var computeArea = function(A, B, C, D, E, F, G, H) {
var r1 = Math.abs(A-C)*Math.abs(B-D);
var r2 = Math.abs(E-G)*Math.abs(F-H);
// 如果ABCD與EGFH沒重疊,直接將r1,r2加總
if( A >= G || B >= H || C <= E || D <= F){
return r1+r2;
}
// 計算重疊的部分
var rD = Math.abs( (Math.max(A,E) - Math.min(C,G)) * (Math.max(B,F) - Math.min(D,H)) )
return r1+r2 - rD;
};
最快
var computeArea = function(A, B, C, D, E, F, G, H) {
var left = Math.max(A, E);
var right = Math.min(C, G);
var down = Math.max(B, F);
var up = Math.min(D, H);
if(right > left && up > down)
return (C-A)*(D-B)+(G-E)*(H-F)-(right-left)*(up-down);
return (C-A)*(D-B)+(G-E)*(H-F)
};
第二
var computeArea = function(A, B, C, D, E, F, G, H) {
var xa = C-A;
var ya = D-B;
var xb = G-E;
var yb = H-F;
var left = Math.max(A,E);
var right = Math.min(C,G);
var bottom = Math.max(B,F);
var top = Math.min(D,H);
var overlap = 0;
if( right>left && top>bottom ){
overlap = (right-left)*(top-bottom);
}
return xa*ya + xb*yb - overlap;
};
第三
var computeArea = function(A, B, C, D, E, F, G, H) {
var left = Math.max(A, E);
var right = Math.min(C, G);
var down = Math.max(B, F);
var up = Math.min(D, H);
if (right > left && up > down)
return (C - A) * (D - B) + (G - E) * (H - F) - (right - left) * (up - down);
return (C - A) * (D - B) + (G - E) * (H - F)
};