8.16单调递增的数字(LC738-M)

8.16单调递增的数字(LC738-M)_第1张图片

算法:

拿一个两位的数字来举例。

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

此时是从前向后遍历还是从后向前遍历呢?

举个例子,数字:332:

若从前向后遍历:

那么就变成了329,此时2又小于了第一位的3了,真正的结果应该是299。

若从后向前遍历:

332的数值变化为:332 -> 329 -> 299

所以,从后向前遍历!

正确代码:

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] chars = s.toCharArray();

        int start = s.length();
        for (int i = s.length()-2; i>=0; i--){
            if (chars[i] > chars[i+1]) {
                chars[i]--;
                start = i+1;
            }
        }
        for (int i=start; i

注意:

1. String s = String.valueOf(n);     valueOf:O大写

2.char[] chars = s.toCharArray();    toCharArray()是调用方法,要加括号

3.int start = s.length();而不是 `int start = s.length() - 1;`

当输入的数字为 223344,假设我们按照 `int start = s.length() - 1;` 来设置起始索引,那么在第一个 for 循环中,没有chars[i] > chars[i+1],不执行

我们会将 `start` 设置为 `s.length() - 1`,即 5。

这将导致在第二个 for 循环中,我们会将从索引 5 设置为 9(223349),这是不正确的,因为实际上我们不需要设置9,223344本身就是单调递增的最大解

4.`Integer.parseInt(String.valueOf(chars))` 这行代码的作用是将字符数组 `chars` 转换为字符串,然后将该字符串解析为整数。

这种转换通常用于将字符数组表示的数字转换为整数。例如,如果 `chars` 是 `['1', '2', '3']`,那么 `String.valueOf(chars)` 将创建字符串 `"123"`,然后 `Integer.parseInt` 将字符串转换为整数 `123`

时间空间复杂度:

时间复杂度为 O(n):

其中 n 是输入数字的位数。算法中的主要操作是将数字转换为字符串,并遍历该字符串一次以找到需要减小的位置。

空间复杂度为 O(n):

主要由字符串 s 和字符数组 chars 所占据的空间决定。

你可能感兴趣的:(#,8.贪心算法,数据结构)