算法学习记录(四十五)

102 阅读1分钟

问:

  1. 天际线问题 解:
  2. 从左往右。记录每个位置的最大高度。当最大高度信息发生变化时,就产生了拐点。
// 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
}