Description Link to heading

738.monotone-increasing-digits

Solution Link to heading

First, we need change the number to a vector<int> dec, for example:1234 to {1, 2, 3, 4}. Then we can traverse the vector, until dec[i] > dec[i + 1], then set dec[i + n] = 9(n >= 1). If dec[i] == dec[i - 1] == ... == dec[j], then dec[j]--, set others as 9, else dec[i]--;

Code Link to heading

class Solution {
private:
    void vec_dec(int n, vector<int> &res) {
        while (n != 0) {
            res.push_back(n % 10);
            n = n / 10;
        }
    }
    int ten(int i) {
        int res = 1;
        while (i != 0) {
            i--;
            res *= 10;
        }
        return res;  
    }
public:
    int monotoneIncreasingDigits(int n) {
        vector<int> dec;
        vec_dec(n, dec);
        std::reverse(dec.begin(), dec.end());
        if (dec.size() <= 1)
            return n;
        for (int i = 0; i < dec.size() - 1; i++) {
            if (dec[i] > dec[i + 1]) {
                // dec[i] = dec[i + 1];
                int j = i + 1;
                int k = i - 1;
                while (j < dec.size())
                    dec[j++] = 9;
                while (i > 0 && dec[i] == dec[i - 1])
                    dec[i--] = 9;
                if ((i > 0 && dec[i] > dec[i - 1]) || i == 0)
                    dec[i] = dec[i] - 1;
                break;
            }      
        }
        int sum = 0;
        for (int i = 0; i < dec.size(); i++) {
            sum += dec[i] * ten(dec.size() - i - 1);
        }
        return sum;
    }
};