### 题目描述

找到不大于 n 的最大的数，该数满足从高位到低位的数字非严格递增。

### 思路解析

这是一道很明显的贪心题目。既然要尽可能的大，那么这个数从高位开始要尽可能地保持不变。那么我们找到从高到低第一个满足 $str[i] > str[i+1]$ 的位置，然后把 $str[i] - 1$ ，再把后面的位置都变成 $9$ 即可。对应可看下面的例子。

* 

```
n   = 1234321
res = 1233999
```

但是由于减小了 $str[i]$ 以后，可能不满足 $str[i-1] <= str[i]$ 了，所以我们在分析下这种情况怎么处理。我们看下这种情况的例子：

* 

```
n    = 2333332
res  = 2299999
```

下面这段比较啰嗦，其实你看了上面的例子你就知道怎么写了。
注意到如果减小 $str[i]$ 以后不满足 $str[i-1] <= str[i]$，那么肯定有 $str[i-1] == str[i]$，此时就需要再 $str[i-1] - 1$，递归地会处理到某个位置 $idx$，我们发现 $str[idx] == str[idx + 1] == ... = str[i]$ 。然后只要$str[idx] - 1$，然后后面都补上 $9$ 即可。

所以代码写起来很简单了。遍历各位数字的时候，求当前最大的数字 max。然后只在 $max < arr[i]$ 的时候才更新 max 对应的 idx（写法类似于查找数组中最大的元素，返回最小的下标）。接着判断是否有 $arr[i] > arr[i + 1]$，如果是，那么 idx 位置数字减 $1$，后面的位置全部置 $9$ 即可。

* []

```Java
class Solution {
    public int monotoneIncreasingDigits(int N) {
        char[] arr = (N + "").toCharArray();
        int max = -1, idx = -1;
        for (int i = 0; i < arr.length - 1; i++) {
            if (max < arr[i]) {
                max = arr[i];
                idx = i;
            }
            if (arr[i] > arr[i + 1]) {
                arr[idx] -= 1;
                for(int j = idx + 1;j < arr.length;j++) {
                    arr[j] = '9';
                }
                break;
            }
        }
        return Integer.parseInt(new String(arr));
    }
}
```

时间复杂度：$O(\log N)$。数字为 $N$，位数为 $\log N$。遍历一遍即可出结果。
空间复杂度：$O(\log N)$。用于存储 char 数组。
