Leetcode 223 Rectangle Area 矩形區域面積

原題地址

https://leetcode.com/problems/rectangle-area/

題目描述

Find the total area covered by two rectilinear rectangles in a 2D plane.
計算兩個矩形所在2D空間內覆蓋的區域面積。

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的最大值。

解題思路

解題思路還是很簡單的,先分別計算兩個矩形的面積並求和,然後減去矩形重合部分的面積即可,因爲重合部分被計算了兩次。對於計算單個矩形的面積非常簡單 dx * dy,剩下的問題就是求重合部分的面積了。

如何判斷兩個矩形有重合?如何計算重合部分面積?

1. 判定重合

對於以下四種情況,肯定無重合:
這裏寫圖片描述

  • (1)如果矩形A的右上頂點的橫座標小於矩形B的左下角的橫座標
  • (2)如果矩形A的左下頂點的橫座標大於矩形B的右上角下角的橫座標
  • (3)如果矩形A的左下頂點的縱座標大於矩形B的右上角的縱座標
  • (4)如果矩形A的右上頂點的縱座標小於矩形B的左下角的縱座標

判定無重合的方法非常簡單,無重合時直接返回重合部分面積爲0。

2. 有重合時求重合部分面積

有重合時,大概如下:
這裏寫圖片描述

簡單描述就是:在兩個矩形的四個頂點中,分別把橫縱座標排序,然後分別取橫縱座標的中間兩個數,其構成的矩形區域就是重合區域

有了如上兩步,這個問題的解決就比較輕鬆了。

代碼

/**
 * 計算兩個矩形覆蓋的總面積
 */
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
    return (D - B) * (C - A) + (H - F) * (G - E) -
            computeRetainArea(A, B, C, D, E, F, G, H);
}

/**
 * 計算兩個矩形重合區域面積
 */
int computeRetainArea(int A, int B, int C, int D, int E, int F, int G, int H) {
    void sort(int*, int, int);
    if (E >= C || G <= A || H <= B || F >= D) return 0; // 不重合
    int nums[4];
    // 計算x座標重合區域差值
    nums[0] = A;
    nums[1] = C;
    nums[2] = E;
    nums[3] = G;
    sort(nums, 0, 3);
    int diffX = nums[1] - nums[2];
    // 計算y座標重合區域差值
    nums[0] = B;
    nums[1] = D;
    nums[2] = F;
    nums[3] = H;
    sort(nums, 0, 3);
    int diffY = nums[1] - nums[2];

    int ans = diffX * diffY;
    return ans < 0 ? -ans : ans;
}

完整代碼 https://github.com/Orange1991/leetcode/blob/master/223/c/main.c

測試數據

-3,0,3,4,0,-1,9,2 : 45
-2,-2,2,2,-2,-2,2,2 : 16
0,0,0,0,-1,-1,1,1 : 4

2015/8/28

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章