1.题目描述
2.思路
局部最优:遇到nums[i-1]>nums[i],将nums[i-1]减1,将nums[i]赋值成9,可以把这两个整数变成最大单调递增的整数。
全局最优:得到小于或等于N的最大单调递增的整数。
举一个例子:
n=332
(1)
right=3
当i等于下标为2的时候
for (int i = nums.length - 1; i >= 1; i–) {
nums[1]>nums[2] //3>2
{
right=2=i;
nums[1]=2;
}
for(i=right;i<3;i++)
{
nums[2]=9
}
res=329,还是不符合
(2)
当i=1时
for (int i = 1; i >= 1; i–) {
nums[0]>nums[1] //3>2
{
right=1=i;
nums[0]=2;
}
//从索引 right 开始,一直到最后一个元素,把这一段里的所有字符都改成 字符 ‘9’。
for(i=right;i<3;i++)
{
nums[1]==9
}
res=299,符合
3.代码实现
public class Test4 {
public static void main(String[] args) {
Test4 test = new Test4();
int num = 10;
System.out.println(test.monotoneIncreasingDigits(num));
}
public int monotoneIncreasingDigits(int n) {
// 如果是个位数,直接返回
if (n < 10) {
return n;
}
// 把整数转换成字符串
String s = String.valueOf(n);
// 把字符串转换成字符数组
char[] nums = s.toCharArray();
// right用来标记9从哪里开始
// right设置成默认值,为了防止right没有被赋值的情况下执行第2个for循环
int right = nums.length;// 从哪个位置开始全变 9
// 从后往前扫描
for (int i = nums.length - 1; i >= 1; i--) {
if (nums[i - 1] > nums[i]) {// 出现非递增
// 当前字符做一个标记
right = i; // 标记右边界
nums[i - 1]--; // 高位减 1
}
}
////从索引 right 开始,一直到最后一个元素,把这一段里的所有字符都改成 字符 '9'。
for (int i = right; i < nums.length; i++) {
nums[i] = '9';
}
String res = new String(nums);
return Integer.parseInt(res);
}
}