題意:
如第一幅圖所示,求由很多可能重疊矩形能夠覆蓋最終的最終圖案的形狀,如第二幅圖所示。
思路:
-
用掃描線思想, 從左往右掃描,另外加上一個最大堆來維護滿足條件的所有矩形裏的高度的最高值。
-
另外實現的時候有一些小細節很巧妙。
-
c++和python裏對元組的排序,默認都是從低位從小大大排序。
-
時間複雜度: (nlogn)
代碼:
class Solution:
def getSkyline(self, buildings) :
res = [0,0]
builds = []
for l, h, r in builds:
builds.append(l , -h, r)
builds.append(r, h, 0)
builds.sort()
import heapq
heap = [[0, float('inf')]]
for l, h ,r in builds:
while l >= heap[0][1]:
heapq.heappop(heap)
if h<0:
heapq.heappush(heap, [h ,r])
if res[-1][1] != heap[0][0]:
res.append(l , -heap[0][0])
return res
class Solution {
public:
vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
vector<vector<int>> builds;
vector<vector<int>> res;
for(auto& build : buildings){
builds.push_back({build[0], -build[2]});
builds.push_back({build[1], build[2]});
}
sort(builds.begin(), builds.end());
multiset<int> big_heap({0});
vector<int> last = {0,0};
for(auto& item: builds){
if(item[1]<0) big_heap.insert(-item[1]);
else big_heap.erase(big_heap.find(item[1]));
auto max_height = *big_heap.rbegin();
if(last[1]!= max_height){
last[0] = item[0];
last[1] = max_height;
res.push_back(last);
}
}
return res;
}
};