题目
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1:
输入: N = 10
输出: 9
示例 2:
输入: N = 1234
输出: 1234
示例 3:
输入: N = 332
输出: 299
解题思路
- 采用贪心的算法, 对于数组data找到索引index满足data[index] > data[index+1],,再往前搜索如果data[index-1] > data[index] data[index-1]=data[index-1]-1 ; index = index-1,最后将index +1 后面的序列都变成9。
- 思路和上面相近,只是在往前index搜索的时候采用了递归。
代码
贪心算法
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string strN = to_string(N);
int i = 1;
while (i < strN.length() && strN[i - 1] <= strN[i]) {
i += 1;
}
if (i < strN.length()) {
while (i > 0 && strN[i - 1] > strN[i]) {
strN[i - 1] -= 1;
i -= 1;
}
for (i += 1; i < strN.length(); ++i) {
strN[i] = '9';
}
}
return stoi(strN);
}
递归算法
class Solution {
public:
void findMaxIncreasingDigits(std::vector<int> &val)
{
int k = 0;
for (int i = 0; i < val.size() -1; i++)
{
if (val[i] > val[i+1])
{
k = i+1;
break;
}
}
if (k == 0)
{
return;
}
for (int j = k; j < val.size(); j++)
{
val[j] = 9;
}
for (int i = k-1; i >=0; i--)
{
if (val[i] - 1 >=0)
{
val[i] = val[i] - 1;
break;
}
else
{
val[i] = 9;
}
}
findMaxIncreasingDigits(val);
}
int monotoneIncreasingDigits(int N) {
std::vector<int> val;
while(N > 0)
{
val.push_back(N%10);
N = N /10;
}
reverse(val.begin(), val.end());
findMaxIncreasingDigits(val);
int res = 0;
for (int i = 0; i < val.size(); i++)
{
res = res * 10 + val[i];
}
return res;
}
};