738. 单调递增的数字


这个一般性的规律我是找到了,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9。
但我总是开始想的是,局部最优就是全局最优了,因此总是纠结于局部细节缝缝补补,结果还错了。
但这贪心算法是从局部最优推出全局最优,因此就是一个遍历递推的过程。
后面数字要全部变成9,这个也不是一个一个改,而是找到一个范围一起改,因此就需要一个变量来记录位置。

其次C++中数字转字符,字符转数字有简单的库函数。
string strNum = to_string(N);
stoi(strNum);

完整代码:

点击查看代码
class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string strNum = to_string(N);
        // flag用来标记赋值9从哪里开始
        // 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
        int flag = strNum.size();
        for (int i = strNum.size() - 1; i > 0; i--) {
            if (strNum[i - 1] > strNum[i] ) {
                flag = i;
                strNum[i - 1]--;
            }
        }
        for (int i = flag; i < strNum.size(); i++) {
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};
posted @ 2024-01-28 21:43  yun-che  阅读(15)  评论(0)    收藏  举报