Skip to content

Latest commit

 

History

History
51 lines (40 loc) · 1.62 KB

223md.md

File metadata and controls

51 lines (40 loc) · 1.62 KB

223. Rectangle Area

##題目 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.

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

##翻譯 計算兩個長方形所覆蓋的面積,每個長方形都是由左下頂點與右上頂點決定,如圖所示。

假設覆蓋面積不會過int的最大值。

##思路

  1. 先考慮兩個長方形不交疊的情況,只要單純的計算面積相加即可
  2. AB,EF分別為左下頂點,CD,GH分別為右上頂點,如果A>=G表示第一個長方形在第二個長方形右側而且面積不重疊
  3. 同樣方法可判斷兩個長方形其他三個點是否有交疊的情況
  4. 如果有交疊的情況發生,使用max(A,E)可以找出交疊正方形的左下頂點,同樣方法可以找出交疊正方形正確位置並計算面積

##解題

/**
 * @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) {
    // 分別計算ABCD與EGFH的面積
    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;
};