原題地址
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