题目描述
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
输入: N = 10 输出: 9输入: N = 1234 输出: 1234输入: N = 332 输出: 299
解题思路
1.拿到这个题目,最开始使用暴力解法,从N-9每个数判断是否是递增数,但是这样结果是超出时间限制;
2.从最后一位开始判断,如果这一位比之前的几位都大,那么继续判断,否则,让该位的数为9,前一位的数-1;
代码
class Solution {
public:
vector<int> incre(int n)
{
vector<int> m;
while(n>0)
{
m.push_back(n%10);
n=n/10;
}
return m;
}
int find_max(vector<int>& n)
{
int num=n.size();
int i;
int max=-1;
int index=0;
for(i=0;i<num;i++)
{
if(max<n[i])
{
max=n[i];
index=i;
}
}
return index;
}
int monotoneIncreasingDigits(int n) {
int i;
vector<int> num=incre(n);
int max_index;
int temp=n;
int flag=-1;
int sum=num.size();
vector<int> temp_num=num;
for(i=0;i<sum-1;i++)
{
max_index=find_max(temp_num);
if(max_index==0)
{
temp=temp/10;
temp_num=incre(temp);
}
else
{
flag=i;
num[i]=9;
num[i+1]--;
temp=temp/10-1;
temp_num=incre(temp);
}
}
int result=0;
for(i=0;i<=flag;i++)
{
num[i]=9;
}
reverse(num.begin(),num.end());
for(i=0;i<sum;i++)
{
result=result*10+num[i];
}
return result;
}
};