代码随想录第37天| 738.单调递增的数字 , 968.监控二叉树 ,总结

LeetCode 738.单调递增的数字

题目链接:738. 单调递增的数字 - 力扣(LeetCode)

思路:

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strnum = to_string(n);
        //flag用来标记赋值9从哪里开始
        //设置这个默认值,为了防止第二个for循环在flag没有赋值的情况下执行
        int flag = strnum.size();
        for(int i = strnum.size() - 1; i > 0; i--) {
            if(strnum[i - 1] > strnum[i]) {
                flag = i;
                strnum[i - 1]--;
            }
        }
        for(int i = flag; i < strnum.size(); i++) {
            strnum[i] = '9';
        }
        return stoi(strnum);
    }
};

LeetCode968.监督二叉树

题目链接:968. 监控二叉树 - 力扣(LeetCode)

思路:

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

/**
 * 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;
    int travelsal(TreeNode* cur) {
        //空节点,该节点有覆盖
        if(cur == NULL) return 2;
        int left = travelsal(cur->left);//左
        int right = travelsal(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;
        return -1;
    }

    int minCameraCover(TreeNode* root) {
        result = 0;
        if(travelsal(root) == 0) {//情况4.root无覆盖
            result++;
        }
        return result;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值