Binary Tree Cameras
HardDynamic ProgrammingTreeDepth-First SearchBinary Tree
Solution
import { TreeNode } from '@algorithm/lib';
export function minCameraCover(root: TreeNode | null): number {
/**
* 모든 상태
* 1. 현재 노드의 이전 노드까지 전부 모니터링이 되는 경우
* 2. 현재 노드까지 전부 모니터링 되는 경우
* 3. 이전 노드들 모두 모니터링이 되고, 현재 노드에 카메라를 설치한 경우
* @param {string} node - 현재 노드
* @returns {[number, number, number]} 각 상태에 따른 결과 값
*/
function dynamicProgramming(node: TreeNode | null): [number, number, number] {
if (!node) {
return [0, 0, Number.MAX_SAFE_INTEGER];
}
const left = dynamicProgramming(node.left);
const right = dynamicProgramming(node.right);
return [
left[1] + right[1],
Math.min(left[2] + Math.min(...right.slice(1)), right[2] + Math.min(...left.slice(1))),
Math.min(...left) + Math.min(...right) + 1,
];
}
return Math.min(...dynamicProgramming(root).slice(1));
}