代码随想录算法训练营第37天|738.单调递增的数字、968.监控二叉树(待二刷)

文章目录

  • 738.单调递增的数字
    • 思路
    • 代码
  • 968.监控二叉树
    • 思路
    • 代码

738.单调递增的数字

题目链接:738.单调递增的数字
文章讲解:代码随想录|738.单调递增的数字
视频讲解:738.单调递增的数字

思路

从后向前遍历,如果前一个数字比后一个数字大,就将前一个数字-1,然后将后一个数字赋值为9
错误的写法:

    int monotoneIncreasingDigits(int n) {
        string strNum = to_string(n);
        for(int i = strNum.size() - 1; i >= 1; i--){
            if(strNum[i] < strNum[i - 1]){
                strNum[i - 1] = strNum[i - 1] - 1;
                strNum[i] = '9';
            }
        }
        return stoi(strNum);
    }

当n=1000时,因为后面两位0是相等的,算法不会对其操作,只会从开头的1和0进行操作,返回的值为900,而正确答案应该是999。
所以要设置一个flag,记录离结尾最近的-1位置,然后把该位置后面全部设为9

代码

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);
    }
};

968.监控二叉树

题目链接:968.监控二叉树
文章讲解:代码随想录|968.监控二叉树
视频讲解:968.监控二叉树

思路

代码


你可能感兴趣的:(算法)