LeetCode C 天際線問題

2021-10-08 01:38:26 字數 1725 閱讀 8673

城市的天際線是從遠處**該城市中所有建築物形成的輪廓的外部輪廓。現在,假設您獲得了城市風光**(圖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 也被認為是建築物。最後,從新陣列的所有四個方向 即頂部,底部,左側和右側 的 天際線 必須與原始陣列的天際線相同。城市的天際線是從遠處 時,由所有...