代码随想录训练营day37:回溯法part5+总结

738.单调递增的数字

332-》329-》299
本质是当相邻位不符合条件时,局部贪心,23-》29,前一位减一,后一位变9,9也的确是最大的

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        //vector<string> numString=to_string(n);
        string numString=to_string(n);
        int flag=numString.size();//int flag=0;初始化为0的话,case1234output9999,flag=0一直没变过
        for(int i=numString.size()-1;i>0;i--){
            if(numString[i-1]>numString[i]){
                //numString[i]='9';不能在这就变为9,case100output90
                numString[i-1]--;
                flag=i;
            }
        } 
        for(int i=numString.size()-1;i>=flag;i--){
            numString[i]='9';
        }
        return stoi(numString);
    }
};

968.监控二叉树

为了让摄像头数量最少,我们要尽量让叶子节点的父节点安装摄像头,这样才能摄像头的数量最少。
那么空节点不能是无覆盖的状态,这样叶子节点就要放摄像头了,空节点也不能是有摄像头的状态,这样叶子节点的父节点就没有必要放摄像头了,而是可以把摄像头放在叶子节点的爷爷节点上。

  • 后序遍历,代码逻辑
  • 状态更新:0无覆盖1有摄像机2有覆盖
if(root==null) return 2;
root->left=traversal(root->left);
root->right=traversal(root->right);
if(root->left==2 && root->right==2) return 0;//情况一:当左右节点都有覆盖时,目前节点无需装摄像机,摄像机应该由上一层装,所以目前是无覆盖0
if(root->left==0 || root->right==0) return 1;//情况二:但凡左右节点有一个处于无覆盖的状态,就需要父节点装摄像机了
if (left == 1 || right == 1) return 2;//情况三:如果左右节点有一个有摄像机,父节点就可以被覆盖到2.而且left=1,right=0这种情况已经在情况二中提到过了,所以注意If条件的顺序

情况四,根节点可能会处于root->left2 && root->right2但是他又没有父节点的状态,所以递归结束之后,还要判断根节点,如果没有覆盖,result++。

int minCameraCover(TreeNode* root) {
    result = 0;
    if (traversal(root) == 0) { // root 无覆盖
        result++;
    }
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值