算法刷题 DAY37

738.单调自增的数字

int monotoneIncreasingDigits(int n) {

    char s[11]={'\0'};
    sprintf(s,"%d",n);//整数转字符串方便进行各位上的遍历
    int len=strlen(s);
    int flag=len;//若flag未更新过则没有赋值为9的操作

    for(int i=len-1;i>0;i--){//遍历到第二位截至
        if(s[i-1]>s[i]){
            s[i-1]--;//减一后必定小于
            flag=i;//此处及右边都要赋为9
        }
    }

    for(int i=flag;i

968.监督二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/**
     节点的状态值:
       0 表示无覆盖
       1 表示 有摄像头
       2 表示有覆盖
    后序遍历,根据左右节点的情况,来判读 自己的状态
     */

int res;//全局

int last_order(struct TreeNode* root){

    if(!root) return 2;//空结点视为有覆盖→忽略

    int left=last_order(root->left);
    int right=last_order(root->right);

    if(left==2&&right==2) return 0;//左右孩子都有覆盖右→在父结点的父结点安装摄像头
    if(left==0||right==0){//有一个孩子未被覆盖→必须安装摄像头
        res++;
        return 1;
    }
    if(left==1||right==1) return 2;//孩子至少一个有摄像头→该节点必定会被覆盖

    return -1;//前面三个if已经包含所有情况;cpp语法没else的情况下不加return会报编译错误
 
}

int minCameraCover(struct TreeNode* root) {

    res=0;
    if(last_order(root)==0) res++;//情况四:根节点未被覆盖时,则在根节点加个摄像头:因为没有父结点了

    return res;
    
}

你可能感兴趣的:(算法,数据结构,leetcode,c语言,c++)