问:
- 假设有一个数组,元素只有.或者×。每个×视为一个障碍物。.视为空旷的地方。对于每个.来说都可以安置一盏灯。安置的灯可以照亮前一个位置,当前位置和后一个位置。想要照亮所有.最少需要多少灯
- 求完全二叉树的节点个数
解:
- 碰到点的时候看下一位是不是点,是的话在下一位上放灯,否则在当前位置放灯
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)
}
}
}