题目:
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
// class Solution {
// private:
// bool isLegal(int num)
// {
// //
// int cur = num % 10;
// int pre;
// num = num / 10;
// while(num != 0)
// {
// pre = cur; // 个位
// cur = num % 10; // 十位
// if(cur > pre)
// {
// return false;
// }
// // 注意这句在循环语句中不能放在第一句,因为最后一次判断的时候会多进入循环一次
// num = num / 10;
// }
// return true;
// }
// public:
// int monotoneIncreasingDigits(int n)
// {
// // 法一:暴力解法 超时了
// for(int i = n; i > 0; i--)
// {
// if(isLegal(i))
// {
// return i;
// }
// }
// return 0;
// }
// };
class Solution {
/* 贪心思想
局部最优:遇到 str[i] < str[i-1] 的情况,就将 str[i-1]--,并把从i开始往后的数都赋值为9
保证从 i 之后的数都是递增的
全局最优:得到小于等于N的最大单调递增整数
注意: 可不要从前往后去遍历哦~这样会改变已经改变的结果,使结果达不到要求。
*/
public:
int monotoneIncreasingDigits(int n)
{
// 这个我就想不起来,要记忆一下呐~~
string str = to_string(n);
// 这个用来更新从哪个下标开始做了-- ,就从 index 开始之后都需要赋值为9
// 犯错点:index需要初始化,那么应该初始化为几合适呢?
// 要考虑大到有可能 index可能不会被更新的情况
// 所以将其更新为 str.size() 最合适
int index = str.size();
// 这里将数字转换成字符串之后,处理多么的便捷呀~~~
for(int i = str.size() - 1; i > 0; i--)
{
if(str[i] < str[i - 1])
{
str[i-1]--;
index = i;
}
}
for(int i = index; i < str.size(); i++)
{
str[i] = '9';
}
return stoi(str);
}
};