代码随想录算法训练营第三十天| 738.单调递增的数字 968.监控二叉树 (可以跳过)

发布时间 2023-07-13 10:37:08作者: 博二爷

 738.单调递增的数字

要求:

保证最大的一个数,它满足 每个位数都是递增的

思路1:

为了减少时间复杂度,当时打算,先判断最大的位数,从大-》小,看以后的位数是否满足当前数比前一个数大

思路2:

其实前面再往后想想:就是如果当前的数不满足,直接降级,然后后面都是9 就可以了 ——》一定要好好看例子结果

代码:

 1 // 要求:返回小于N 但是这个数字的每个位数都是单调递增的
 2 // 
 3 // 难点:怎么判断他是单调递增?
 4 //    1,每个数字转成字符串,然后进行比对
 5 //  2,对每个数字都取余数123 : 先%10 得到3 然后/10  变成12
 6 // 
 7 // 思路:
 8 //    1,先从n往下遍历,如果满足这个条件,那么就可以
 9 // 
10 // 思路2:
11 //    1,先对目标节点遍历,获得它的数值,然后必须满足第一个数字是小于等于原数值,后面要求>=前一个
12 // 
13 // 思路3;
14 // 1,如果当前节点不满足,那么就把比这个高的节点降级,然后此节点变成9 
15 // 注意 100 -> 99 变成 一个标志
16 //
17 
18 
19 int monotoneIncreasingDigits(int n) {
20     if (n == 0) return 0;
21 
22     string n_str = to_string(n);
23     int flag = 0;
24     for (int i = n_str.size() - 1; i >= 1; i--)
25     {
26         // 目的:直到找到最大的 n-1,9这样的情况,然后9后面的都变成9 
27         if (n_str[i] < n_str[i - 1])
28         {
29             n_str[i - 1] = n_str[i - 1] - 1;
30             flag = i;
31         }
32     }
33     
34     for (int i = flag; i < n_str.size() && flag!=0; i++)
35     {
36         n_str[i] = '9';
37     }
38 
39     return stoi(n_str);
40 }