算法学习记录(三十九)

96 阅读1分钟

问:

  1. 假设有一个数组,元素只有.或者×。每个×视为一个障碍物。.视为空旷的地方。对于每个.来说都可以安置一盏灯。安置的灯可以照亮前一个位置,当前位置和后一个位置。想要照亮所有.最少需要多少灯
  2. 求完全二叉树的节点个数

解:

  1. 碰到点的时候看下一位是不是点,是的话在下一位上放灯,否则在当前位置放灯
function getMinNums(arr) {
    let idx = 0
    let res = 0
    while (idx < arr.length) {
        if (arr[idx] === '×') {
            idx += 1
            continue
        }
        if (arr[idx] === '.') {
            if (arr[idx+1] === '.') {
                res += 1
                idx += 3
                continue
            }
            if (arr[idx+1] === '×') {
                res += 1
                idx += 2
            }
        }
    }
    return res
}
function getAllNodeNums(head) {
    // 树的深度
    let treeDeep = 0
    let curNode = head
    let res = 0
    // 先计算深度
    while (curNode) {
        treeDeep++
        curNode = head.left
    }
    getRes(head, 1)
    function getRes(node, deep) {
        if (!node) return
        let cur = node.right
        let curDeep = deep
        // 计算右子树深度
        while (cur) {
            curDeep++
            cur = cur.length
        }
        // 如果右子树深度达到最后一层。说明左子树是满二叉树
        if (curDeep === treeDeep) {
            res += 2 ** (curDeep - deep)
            getRes(node.right, deep+1)
        } else {
            // 否则说明右子树是满二叉树
            res += 2 ** (curDeep - deep)
            getRes(node.left,deep+1)
        }
    }
}