题目:
Given a non-negative integer N
, find the largest number that is less than or equal to N
with monotone increasing digits.
(Recall that an integer has monotone increasing digits if and only if each pair of adjacent digits x
and y
satisfy x <= y
.)
Example 1:
Input: N = 10 Output: 9
Example 2:
Input: N = 1234 Output: 1234
Example 3:
Input: N = 332 Output: 299
Note: N
is an integer in the range [0, 10^9]
.
思路:
我们首先解析出N中所有的位数,然后顺次检查是否出现了逆序,即digits[i] > digits[i + 1],如果出现了,则我们将digits[i]减1,并将i之后的所有位置上的数都置为9。最后根据修改后的digits重构出N即可。
代码:
class Solution {
public:
int monotoneIncreasingDigits(int N) {
vector<int> digits; // construct all the digits
while (N > 0) {
digits.push_back(N % 10);
N /= 10;
}
if (digits.size() < 2) {
return N;
}
reverse(digits.begin(), digits.end());
int first = digits.size() - 2;
while (first >= 0) {
while (digits[first] <= digits[first + 1]) {
--first;
}
if (first < 0) {
break;
}
--digits[first];
for (int i = first + 1; i < digits.size() && digits[i] < 9; ++i) {
digits[i] = 9;
}
--first;
}
int ret = 0;
for (int i = 0; i < digits.size(); ++i) {
ret = 10 * ret + digits[i];
}
return ret;
}
};