问:
- 天际线问题 解:
- 从左往右。记录每个位置的最大高度。当最大高度信息发生变化时,就产生了拐点。
// TODO 待优化 应该用大根堆来查询最大高度
function getSkyline(buildings) {
const helpArr = []
const res = []
for (let i of buildings) {
const addNode = {
idx: i[0],
type: 1,
height: i[2]
}
const delNode = {
idx: i[1],
type: 2,
height: i[2]
}
helpArr.push(addNode, delNode)
}
// 根据坐标排序
helpArr.sort((a, b) => {
return a.idx - b.idx || b.type - b.type
})
// 记录高度次数
const heightArr = []
// 记录对应位置高度
const idxHeight = new Map()
let maxHeight = 0
for (let i of helpArr) {
const idx = heightArr.findIndex(val => val[0] === i.height)
if (i.type === 1) {
if (idx !== -1) {
heightArr[idx][1] = heightArr[idx][1] + 1
} else {
heightArr.push([i.height, 1])
}
}
if (i.type === 2) {
heightArr[idx][1] = heightArr[idx][1] - 1
if (heightArr[idx][1] === 0) {
heightArr.splice(idx, 1)
maxHeight = 0
}
}
heightArr.forEach(val => maxHeight = Math.max(val[0], maxHeight))
idxHeight.set(i.idx, maxHeight)
}
let preHeight = 0
for (let i of idxHeight.entries()) {
if (i[1] !== preHeight) {
res.push([...i])
}
preHeight = i[1]
}
return res
}