城市的天際線是從遠處**該城市中所有建築物形成的輪廓的外部輪廓。現在,假設您獲得了城市風光**(圖a)上顯示的所有建築物的位置和高度,請編寫乙個程式以輸出由這些建築物形成的天際線(圖b)。
每個建築物的幾何資訊用三元組 [li,ri,hi] 表示,其中 li 和 ri 分別是第 i 座建築物左右邊緣的 x 座標,hi 是其高度。可以保證 0 ≤ li, ri ≤ int_max, 0 < hi ≤ int_max 和 ri - li > 0。您可以假設所有建築物都是在絕對平坦且高度為 0 的表面上的完美矩形。
例如,圖a中所有建築物的尺寸記錄為:[ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ] 。
輸出是以 [ [x1,y1], [x2, y2], [x3, y3], … ] 格式的「關鍵點」(圖b中的紅點)的列表,它們唯一地定義了天際線。關鍵點是水平線段的左端點。請注意,最右側建築物的最後乙個關鍵點僅用於標記天際線的終點,並始終為零高度。此外,任何兩個相鄰建築物之間的地面都應被視為天際線輪廓的一部分。
例如,圖b中的天際線應該表示為:[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8], [24, 0] ]。
說明:
任何輸入列表中的建築物數量保證在 [0, 10000] 範圍內。
輸入列表已經按左 x 座標 li 進行公升序排列。
輸出列表必須按 x 位排序。
輸出天際線中不得有連續的相同高度的水平線。例如 [...[2 3], [4 5], [7 5], [11 5], [12 7]...] 是不正確的答案;三條高度為 5 的線應該在最終輸出中合併為乙個:[...[2 3], [4 5], [12 7], ...]
思路:先用乙個multiset> 對角點進行儲存和排序,其中左角點的高度用負值,這樣能保證當x值相同時,高度大的排在前面。
建立高度multiset,用於儲存當前位置所有的高度。遍歷角點。若為左角點,則將其高度壓入高度multiset,若為右角點,則說明該建築要出去了,則將其高度在高度multiset中擦去。
在遍歷角點的過程中,若最大高度不同於上乙個高度,則認為是關鍵點。
知識點:
multiset中的元素是 pair,對pair排序預設的方式是,先比較 first,哪個小則排在前;first 相等則 second小的排在前。
**:
vector
int>>
getskyline
(vector
int>>
& buildings)
//篩選角點
multiset<
int>
heights()
;//當前所有建築的高度,預先插入的0很重要
vector<
int> last=
;//歷史最高點位置(橫座標,高度)
for(
auto
& e:all )
}return res;
}
結果:[1] allen:218. 天際線問題 - 掃瞄線法 218 天際線問題
城市的天際線是從遠處 該城市中所有建築物形成的輪廓的外部輪廓。現在,假設您獲得了城市風光 圖a 上顯示的所有建築物的位置和高度,請編寫乙個程式以輸出由這些建築物形成的天際線 圖b 每個建築物的幾何資訊用三元組 li,ri,hi 表示,其中li和ri分別是第 i 座建築物左右邊緣的 x 座標,hi是其...
multiset pair 218 天際線問題
城市的天際線是從遠處 該城市中所有建築物形成的輪廓的外部輪廓。現在,假設您獲得了城市風光 圖a 上顯示的所有建築物的位置和高度,請編寫乙個程式以輸出由這些建築物形成的天際線 圖b 每個建築物的幾何資訊用三元組 li,ri,hi 表示,其中 li 和 ri 分別是第 i 座建築物左右邊緣的 x 座標,...
領扣題號807 城市天際線
題目詳情 在二維陣列grid中,grid i j 代表位於某處的建築物的高度。我們被允許增加任何數量 不同建築物的數量可能不同 的建築物的高度。高度 0 也被認為是建築物。最後,從新陣列的所有四個方向 即頂部,底部,左側和右側 的 天際線 必須與原始陣列的天際線相同。城市的天際線是從遠處 時,由所有...