leetcode 968 监控摄像头

简介: leetcode 968 监控摄像头

监控摄像头


38145f54ee224da3a58e508f132d3f41.png

5cd8af91d1834fd48f0c21a8e35ac3b1.png

从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!

此时,大体思路就是从低到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。

我们分别有三个数字来表示:

0:该节点无覆盖

1:本节点有摄像头

2:本节点有覆盖

  • 情况1:左右节点都有覆盖
    左孩子有覆盖,右孩子有覆盖,那么此时中间节点应该就是无覆盖的状态了。

96d91280c2fc4bffbf1e44b11d630e20.png

情况2:左右节点至少有一个无覆盖的情况

如果是以下情况,则中间节点(父节点)应该放摄像头:

954fe062230748ff9629bf7cb1494cba.png

  • 情况3:左右节点至少有一个有摄像头
    如果是以下情况,其实就是 左右孩子节点有一个有摄像头了,那么其父节点就应该是2(覆盖的状态)
  • 情况4:头结点没有覆盖
    以上都处理完了,递归结束之后,可能头结点 还有一个无覆盖的情况,如图:

d1546d0dfd8942dbb6a24e1799f4fb0c.png

class Solution {
private:
    int result;
    int traversal(TreeNode* cur) {
        // 空节点,该节点有覆盖
        if (cur == NULL) return 2;
        int left = traversal(cur->left);    // 左
        int right = traversal(cur->right);  // 右
        // 情况1
        // 左右节点都有覆盖
        if (left == 2 && right == 2) return 0;
        // 情况2
        // left == 0 && right == 0 左右节点无覆盖
        // left == 1 && right == 0 左节点有摄像头,右节点无覆盖
        // left == 0 && right == 1 左节点有无覆盖,右节点摄像头
        // left == 0 && right == 2 左节点无覆盖,右节点覆盖
        // left == 2 && right == 0 左节点覆盖,右节点无覆盖
        if (left == 0 || right == 0) {
            result++;
            return 1;
        }
        // 情况3
        // left == 1 && right == 2 左节点有摄像头,右节点有覆盖
        // left == 2 && right == 1 左节点有覆盖,右节点有摄像头
        // left == 1 && right == 1 左右节点都有摄像头
        // 其他情况前段代码均已覆盖
        if (left == 1 || right == 1) return 2;
        // 以上代码我没有使用else,主要是为了把各个分支条件展现出来,这样代码有助于读者理解
        // 这个 return -1 逻辑不会走到这里。
        return -1;
    }
public:
    int minCameraCover(TreeNode* root) {
        result = 0;
        // 情况4
        if (traversal(root) == 0) { // root 无覆盖
            result++;
        }
        return result;
    }
};

二刷

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int result = 0;
    int track_back(TreeNode* cur)
    {
        if(cur==nullptr) return 2;//有覆盖
        int left = track_back(cur->left);
        int right = track_back(cur->right);
        if(left==2&&right==2) return 0;//无覆盖
        if(left==0||right==0) 
        {
            result++;
            return 1;//放摄像头
        }
        if(left==1||right==1) return 2;
        return -1;
    }
    int minCameraCover(TreeNode* root) {
        if(track_back(root)==0) result++;
        return result;
    }
};
相关文章
|
17天前
|
传感器 编解码 监控
|
8月前
|
存储 前端开发 Android开发
GB28181设备接入侧录像查询和录像下载技术探究之实时录像
我们在对接GB28181设备接入侧的时候,除了常规实时音视频按需上传外,还有个重要的功能,就是本地实时录像,录像后的数据,在执法记录仪等前端设备留底,然后,到工作站拷贝到专门的平台。
149 1
|
传感器 安全 物联网
无线无源振弦采集仪的常见问题
(1)设置更长的采发时间间隔,减少采发频度。 (2)不需要的通道配置为“不发送”,减少发送的数据内容。 (3) 使用 HEX 格式发送,减少发送的数据长度。 (4)修改 LoRA 参数,缩短发送时长(不推荐)。 (5)关闭唤醒侦听功能(仅保留定时采发功能)。
无线无源振弦采集仪的常见问题
|
编解码 计算机视觉
【方便的Opencv】实现实时监测电脑屏幕与摄像头前的人
【方便的Opencv】实现实时监测电脑屏幕与摄像头前的人
【方便的Opencv】实现实时监测电脑屏幕与摄像头前的人
|
传感器
无线型振弦传感器采集采集仪常见的使用操作说明注意事项
VS-BOX 可使用内置电池(默认)也可使用外部电池工作。 需要特别注意:严禁内置和外部电池(电源)同时使用,严重时会造成短路起火,设备永久损坏。
无线型振弦传感器采集采集仪常见的使用操作说明注意事项
模拟监控摄像头
本报告研究全球与中国市场模拟监控摄像头的产能、产量、销量、销售额、价格及未来趋势。重点分析全球与中国市场的主要厂商产品特点、产品规格、价格、销量、销售收入及全球和中国市场主要生产商的市场份额
模拟监控摄像头系统
本报告研究全球与中国市场模拟监控摄像头系统的产能、产量、销量、销售额、价格及未来趋势。重点分析全球与中国市场的主要厂商产品特点、产品规格、价格、销量、销售收入及全球和中国市场主要生产商的市场份额
|
编解码 网络协议 算法
实战排查|为什么遮挡推流摄像头,会导致播放绿屏?
做音视频的小伙伴们多少都遇到过奇怪的 BUG(如:卡顿、花屏、绿屏、变声等),表象上矛盾点颇多,推理得出的结论都是:“不应该啊!”,最终你抽丝剥茧,发现真相只有一个:“事出反常必有妖”!
实战排查|为什么遮挡推流摄像头,会导致播放绿屏?