leetcode中等738单调递增的数字
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等738单调递增的数字相关的知识,希望对你有一定的参考价值。
思路:贪心,局部最优推出全局最优
局部最优:遇到strNum[i - 1] > strNum[i]
的情况,让strNum[i - 1]--
,然后strNum[i]=9
,可以保证这两位变成最大单调递增整数。
全局最优:得到小于等于N的最大单调递增的整数。
但还需要其他条件,即遍历顺序,和标记从哪一位开始统一改成9。
eg :332,从前向后遍历的话,那么就变成了329,真正的结果应该是299。顺序遍历会改变已写好的部分,所以应当从后向前遍历
332的变化为:332 -> 329 -> 299
class Solution {
public int monotoneIncreasingDigits(int n) {
if (n==0)return 0;
char[] chars= Integer.toString(n).toCharArray();
int start=Integer.MAX_VALUE;//start初始值设为最大值,这是为了防止当数字本身是单调递增时,没有一位数字需要改成9的情况
for (int i=chars.length-1;i>0;i--){
if (chars[i]<chars[i-1]){
chars[i-1]--;
start=i;
}
}
StringBuilder res=new StringBuilder();
for (int i=0;i<chars.length;i++){
if (chars[i]=='0'&&i==0)continue;//防止出现09这样的情况
if (i>=start){
res.append('9');
}else res.append(chars[i]);
}
return Integer.parseInt(res.toString());
}
}
以上是关于leetcode中等738单调递增的数字的主要内容,如果未能解决你的问题,请参考以下文章
力扣算法JS LC [56. 合并区间] LC [738. 单调递增的数字]
贪心算法第六篇:单调递增的数字 + 划分字母区间 + 合并线段区间