leetcode 968. 监控二叉树

111 阅读1分钟

c++

class Solution {
public:
    void getDP(TreeNode* root, int dp[2][2]) {
        if (!root) {
            dp[0][0] = 0;
            dp[0][1] = 10000;
            dp[1][0] = 0;
            dp[1][1] = 10000;
            return ;
        }
        if (!root->left && !root->right) {
            dp[0][0] = 10000;
            dp[0][1] = 1;
            dp[1][0] = 0;
            dp[1][1] = 1;
            return ;
        }
        int l[2][2] = {0}, r[2][2] = {0};
        getDP(root->left, l);
        getDP(root->right, r);
        dp[0][0] = min(min(l[0][1] + r[0][0], l[0][0] + r[0][1]), l[0][1] + r[0][1]);
        dp[1][0] = min(min(l[0][0] + r[0][0], l[0][1] + r[0][1]), min(l[0][1] + r[0][0], l[0][0] + r[0][1]));
        dp[0][1] = min(min(l[1][0] + r[1][0], l[1][1] + r[1][1]), min(l[1][1] + r[1][0], l[1][0] + r[1][1])) + 1;
        dp[1][1] = dp[0][1];
        return ;
    }

    int minCameraCover(TreeNode* root) {
        int dp[2][2] = {0};
        getDP(root, dp);
        return min(dp[0][1], dp[0][0]);
    }
};

js

function getDp(root, dp) {
    if (!root) {
        dp[0][0] = 0;
        dp[0][1] = 10000;
        dp[1][0] = 0;
        dp[1][1] = 10000;
        return ;
    }
    if (!root.left && !root.right) {
        dp[0][0] = 10000;
        dp[0][1] = 1;
        dp[1][0] = 0;
        dp[1][1] = 1;
        return ;
    }
    var l = Array(2).fill(0).map(x => Array(2).fill(0)), r = Array(2).fill(0).map(x => Array(2).fill(0));
    getDp(root.left, l);
    getDp(root.right, r);
    dp[0][0] = Math.min(l[0][1] + r[0][1], l[0][1] + r[0][0], l[0][0] + r[0][1]);
    dp[0][1] = Math.min(l[1][1] + r[1][1], l[1][1] + r[1][0], l[1][0] + r[1][1], l[1][0] + r[1][0]) + 1;
    dp[1][0] = Math.min(l[0][1] + r[0][1], l[0][1] + r[0][0], l[0][0] + r[0][1], l[0][0] + r[0][0]);
    dp[1][1] = dp[0][1];
    return ;
}

var minCameraCover = function(root) {
    var dp = Array(2).fill(0).map(x => Array(2).fill(0));
    getDp(root, dp);
    return Math.min(dp[0][1], dp[0][0]); 
};