2020-12-15 单调递增的数字

题目


解题方法

贪心法

采用贪心的思想解决该问题,对于输入\(N\),先将其转换为字符串\(digit\)(方便索引与修改)。
从高位向低位遍历,直至碰到第一个元素\(digit[i]\),使得\(digit[i]>=digit[i-1]\),将\(digit[i-1]\)的值减去\(1\),再将低位上的数都改为\(9\)。但是,可能碰到这种情况:\(digit[i-1]\)减掉\(1\)后使得\(digit[i-1]<digit[i-2]\),因而破坏了单调递增的条件,因此在进行了上述操作之后,还要往前回溯直到找到下标\(j\left(0<j<digit.size()\right)\)使得\(digit[j]-1 >= digit[j-1]\),然后将\(j\)之后的低位上的数都改为\(9\)

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        if (N < 10)
            return N;

        string digit = to_string(N);      // 将N转化为字符串
        int i = 1;
        while (i < digit.size() && digit[i-1] <= digit[i]) { 
            i++;            // 从高位往低位遍历,寻找破坏单调递增条件的元素
        }

        if (i < digit.size()) {      // 若找到了
            while (i > 0 && digit[i-1] > digit[i]) {
                digit[i-1] -= 1;    
                i--;
            }

            for (i += 1; i < digit.size(); i++) {
                digit[i] = '9';
            }
        }

        return stoi(digit);      // 将字符串转换为整数
    }
};

提交结果


总结

在解决本题时使用了贪心的思想,从高位往低位遍历,尽可能地使得到的值最大。
在编写代码时使用了两个库函数to_string()stoi(),这两个函数的LLVM实现在这里
努力看了一下实现源码,发现看不懂:(,待以后进一步学习C++模板等内容了再看吧。

posted @ 2020-12-15 19:44  刷书狂魔  阅读(98)  评论(0编辑  收藏  举报
总访问: counter for blog 次