LintCode 743. 单调递增的数字
Posted J1ac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode 743. 单调递增的数字相关的知识,希望对你有一定的参考价值。
给一非负整数 N
, 找到小于等于 N 的最大的 单调递增数. (回想一下, 当且仅当每对相邻的数字 x 和 y 满足 x <= y 时, 这个整数才是单调递增数)
注意事项
N
为范围 [0, 10^9]
内的整数
样例
给出 N
= 10
, 返回 9
给出 N
= 12345
, 返回 12345
给出 N
= 10000
, 返回 9999
思路:从后往前找到最后上升的两个数,然后将这两个数里面前面一个数-1,后面的数全部改成9就行了,这个处理string比较好操作一点,所以这里我经过了int和string的转变处理,直接int上操作要用%10然后多一些细节,需要注意的是这样的两个数找到之后需要继续往前搜索是否存在相同的数,找到最前面的数然后减一,否则就会出错,可以考虑范例中的111111110。
1 class Solution { 2 public: 3 /** 4 * @param num: a non-negative integer N 5 * @return: the largest number that is less than or equal to N with monotone increasing digits. 6 */ 7 int monotoneDigits(int num) { 8 // write your code here 9 string s = to_string(num); 10 char before = ‘9‘; 11 int index = s.size()-1; 12 for(int i = s.size()-1; i>=0; --i){//从后往前找到增加最后一对上升数对 13 if(s[i]>before) index = i; 14 before = s[i]; 15 } 16 if(index == s.size()-1) return num;//index没变表示全部升序排列,返回原数 17 while(index>0 && s[index-1] == s[index]) index--;//关键一步,否则会出错,注意越界 18 s[index]--; 19 for(int j = index+1; j<s.size(); ++j) s[j]=‘9‘;//后面的数全部转变为9 20 return stoi(s);//用stoi省去了头部可能的去0操作 21 } 22 };
以上是关于LintCode 743. 单调递增的数字的主要内容,如果未能解决你的问题,请参考以下文章
贪心算法第六篇:单调递增的数字 + 划分字母区间 + 合并线段区间