Skip to content

单调递增的数字

题目描述

当且仅当每个相邻位数上的数字 xy 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增

题目链接:https://leetcode.cn/problems/monotone-increasing-digits/

文章讲解:https://programmercarl.com/0738.单调递增的数字.html

思考

题目要求最大数字,因此我们先试着-1,对于332这个例子,-1后是331,数字不是单调递增的,因此-1没有意义,可以让10位-1,得到322,后两位满足单调递增,继续让百位-1,得到222,百位减1之后10位和个位可以变为99

总体思路就是从后向前遍历,如果不满足单调递增就调至单调递增,如果满足就找到最后一个变化的位置,往后位数字全部变为9

例如342,遍历i==2,此时str[i-1] < str[i] 那么标志位就是 i==1,标志位-1后,从标志位往后全变成9

代码实现

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