前往
大廳
主題

LeetCode - 850. Rectangle Area II 解題心得

Not In My Back Yard | 2022-02-02 00:00:01 | 巴幣 0 | 人氣 221

題目連結:


題目意譯:
我們被給定一個(與軸對齊的)矩形列表 rectangles。每個 rectangles[i] = [xi1, yi1, xi2, yi2],其中 (xi1, yi1) 為第 i 個矩形左下角的座標而 (xi2, yi2) 為右上角的座標。

計算所有矩形在座標平面總覆蓋面積。由於答案可能太大,將其模 10 ^ 9 + 7 後再回傳。

限制:
1 ≦ rectangles.length ≦ 200
rectanges[i].length = 4
0 ≦ rectangles[i][j] ≦ 10 ^ 9
所有矩形的總覆蓋面積不會超過 2 ^ 63 - 1 因此可以存進一個 64 位元有號整數內。



範例測資:
範例 1:
輸入: rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
輸出: 6
解釋: 如圖所示。

範例 2:
輸入: rectangles = [[0,0,1000000000,1000000000]]
輸出: 49
解釋: 答案是 10 ^ 18 模 (10 ^ 9 + 7),其為 (10 ^ 9) ^ 2 = (-7) ^ 2 = 49。


解題思維:
我們可以利用掃描線演算法(Sweep Line Algorithm,如這題)的精神來將所有矩陣的左下角與右上角分拆開來——把左下角當作「進入」、右上角當作「離開」這兩種端點,然後我們將所有端點座標按照 X 座標由小到大排序並掃過。

每掃到一個端點時,先利用這題的想法來計算出目前還處於「進入」的所有矩形在 Y 軸上總覆蓋長度 LY。接著計算現在這個端點的 X 座標與前一個端點的 X 座標的差值 LX(如果現在是第一個端點,則 LX = 0)。因此前一個端點到現在這個端點,我們將會多覆蓋 LX × LY 單位面積。

接著判斷端點的類型:
如果是「進入」,則我們需要將現在這個端點代表的矩形的 Y 座標範圍放到一個列表中,並將其重新排序(所以上面計算 Y 軸上覆蓋長度時是使用這個列表);

如果是「離開」,則我們需要將這個端點代表的矩形的 Y 座標範圍從列表中移除。

因此掃完之後,將所有中途計算的多覆蓋的面積加總並模 10 ^ 9 + 7 後即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作