題目連結:
題目意譯:
一座城市的天際線是由從遠處看向城市中所有建築物時,其外部輪廓所形成的剪影。給定所有建築物的位置以及高度,請回傳這些建築物共同形成的天際線。
每個建築物的幾何資訊以一陣列 buildings 給定,其中 buildings[i] = [lefti, righti, heighti]:
lefti 為第 i 個建築物的左側邊緣之 x 座標、
righti 為第 i 個建築物的右側邊緣之 x 座標、
heighti 為第 i 個建築物的高度。
你可以假設所有建築物都是完美的矩形並座落於位於高度 0 的完全平坦之地面。
天際線應表為一系列的「關鍵點」(Key points)所形成之列表,其以它們的 x 座標由小排到大且格式為 [[x1,y1],[x2,y2],…]。列表中每個關鍵點皆為某個水平線段的左端點,除了最後一個點以外,其 y 座標必為 0 而且是用來標註天際線之結尾,即最右側的建築物之結尾。而最左側到最右側的建築物之間的任何地面也應為天際線輪廓的一部份。
注:輸出的天際線不能有連續的同高度水平線。例如說,[…,[2,3],[4,5],[7,5],[11,5],[12,7],…] 是不被接受的;高度 5 的三條線應合併成為一條於最終的輸出如:[…,[2 3],[4 5],[12 7],…]
限制:
1 ≦ buildings.length ≦ 10 ^ 4
0 ≦ lefti < righti ≦ 2 ^ 31 - 1
1 ≦ heighti ≦ 2 ^ 31 - 1
buildings 將以 lefti 按非遞減之順排序。
範例測資:
範例 1:
輸入: buildings = [[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]
輸出: [[2,10],[3,15],[7,12],[12,0],[15,10],[20,8],[24,0]]
解釋:
圖 A 表示了輸入中的建築物。
圖 B 表示了這些建築物形成的天際線。圖 B 中的紅點代表著輸出列表中的關鍵點。
範例 2:
輸入: buildings = [[0,2,3],[2,5,3]]
輸出: [[0,3],[5,0]]
解題思維:
其實跟
這題有點類似,都是需要使用掃描線演算法(Sweep Line Algorithm)的精神。
只是過程中,每個「事件」(也就是所有建築物的左右兩個端點形成的列表中的元素,且已由小到大排序)代表著一個建築物的開始或結束,而我們需要判斷以該 x 座標劃一條線切到的所有建築物最高者(可以用一個優先佇列(Priority Queue)來維護)。
然後判斷該位置的最高是否與之前的最高一樣,如果一樣則代表現在是先前天際線的延長,因此忽略此高度;反之,代表現在將會形成一個新的關鍵點,其 x 座標即為當前事件的 x 座標而 y 座標為現在這個最高高度值。
掃完所有事件之後便可以求得所求天際線。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。