如圖,假設有一條線從左往右掃瞄陣列:
1、遇到左端點,則記錄當前x座標下的最大高度
2、遇到右端點,則記錄當前x座標下的最大高度
很明顯,我們可以採用大頂堆來儲存座標為x時,當前建築的高度h[x].
遇到左端點則把高度入堆,當前堆頂元素即為x處最大高度
遇到右端點,則把對應建築的左端點出堆,此時堆頂同樣是x處最大高度
func getskyline(buildings int) int
// 排序,x小的排前面,x相同時高的排前面
sort.slice(heights, func(i, j int) bool
return heights[i][0] < heights[j][0]
}) var res int
// 堆中初始化0元素,用於遇到右端點時,能拿到[i,0]作為當前高度
h := heap
last := 0
for _, height := range heights else
}} // 這裡是為了不連續出現[4,8], [12,8]這種相同高度的情況
if last != h[0]
} return res
}// 大頂堆
type heap int
func (h heap) len() int
func (h heap) less(i, j int) bool
func (h heap) swap(i, j int)
func (h *heap) push(x inte***ce{})
func (h *heap) pop() inte***ce{}
LeetCode 218 天際線問題 掃瞄線解法
本題思路,每次遇到乙個左邊就加入陣列,遇到右邊就出陣列,每次記錄當前最大的高度,如果最大高度變化,天際線位置也要隨著改變。我沒有找到合適的資料結構去記錄這一變化,用vector每次修改的複雜度是o n 肯定會超時,後來看到網上有用到multiset,之前沒用過,其實這就是允許有重複元素的set,這樣...
218 天際線問題
城市的天際線是從遠處 該城市中所有建築物形成的輪廓的外部輪廓。現在,假設您獲得了城市風光 圖a 上顯示的所有建築物的位置和高度,請編寫乙個程式以輸出由這些建築物形成的天際線 圖b 每個建築物的幾何資訊用三元組 li,ri,hi 表示,其中li和ri分別是第 i 座建築物左右邊緣的 x 座標,hi是其...
multiset pair 218 天際線問題
城市的天際線是從遠處 該城市中所有建築物形成的輪廓的外部輪廓。現在,假設您獲得了城市風光 圖a 上顯示的所有建築物的位置和高度,請編寫乙個程式以輸出由這些建築物形成的天際線 圖b 每個建築物的幾何資訊用三元組 li,ri,hi 表示,其中 li 和 ri 分別是第 i 座建築物左右邊緣的 x 座標,...