代码随想录算法训练营第三十七天

文章讲述了如何找到不大于给定数值的最大单调递增数字,通过从后往前遍历调整并记录不满足递增的位置,确保后续位均为9。同时介绍了监控二叉树中最小相机覆盖的问题,涉及递归遍历节点并计算覆盖策略。
摘要由CSDN通过智能技术生成

738.单调递增的数字

        思路:从后往前逐位判断相对前一位是否单调递增,如果不满足单调递增条件,就将前一位数值减一,并记录下当前数字的位置,随着for循环不断更新不满足单调递增条件的位置。

        重点:

        为什么从后往前遍历?根据给出的用例进行模拟,发现从前向后并不能保证结果正确,但是从后向前符合修改的逻辑,并且结果也是正确的。

        为什么不满足条件前一位数值减一?题目要求的是不大于给定数值的最大单调递增数字,如果当前位数不满足单调递增,例如332,遍历到2,2不满足>=3,这个时候要求的数字的个位数必须小于2,并且保证递增要大于3,这明显是不可能的,对于332的后两位来说,这个数字一定不能超过30,于是便是29,即前一个位数减1,记录下当前数字(2)的位置。

        为什么要记录下当前遍历数字的位置?这个位置代表这个位置与其之后的位置必须全部变成数字9。

        为什么是后面的数字全部变成9?可以类比332的逻辑,如果是32000,那我肯定不能返回30000以上的结果,于是返回29999,所以可以看到后面的数字全部变成9了。

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string result = to_string(n);
        int flag = result.size();
        for(int i = result.size() - 1; i > 0; i--){
            if(result[i] < result[i - 1]){
                result[i - 1]--;
                flag = i;
            }
        }
        for(int i = flag ; i < result.size(); i++){
            result[i] = '9';
        }
        return stoi(result);
    }
};

968.监控二叉树

        这个题目的思路比较复杂,等二刷的时候再来琢磨这道题。下图指明了本题的思路。

/**
 * 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 minCameraCover(TreeNode* root) {
        if(!traversal(root)){
            result++;
        }
        return result;
    }

    int traversal(TreeNode* node){
        if(node == nullptr)return 2;
        int left = traversal(node->left);
        int right = traversal(node->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;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值