代码随想录算法训练营第三十七天| 738.单调递增的数字

738.单调递增的数字

首先需要将数字转换为字符串,这样才能对每一位数字进行操作。
整体思路就是:
不算遍历每一位,当出现s[i] < s[i-1]时,将s[i-1]减一,后面的数字都变为9;
但是如果从左到右遍历,容易出现s[i-1]-1之后比s[i-2]小的情况,例如 332,按照从左到右的顺序将变为 329,但是期望的值其实是299

所以应该从右往左遍历,不断利用上一次改变的结果,设置一个标志位记录第一次需要改变数字的第一位,然后将后面的数都变为9

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        if (n < 10) return n;
        string s = to_string(n);
        int flag = s.size();
        for (int i = s.size() - 1; i > 0; i--) {
            if (s[i-1] > s[i]) {
                flag = i; //记录开始变为9的位置
                s[i-1]--; 
            }
        }
        for (int i = flag; i < s.size(); i++) {
            s[i] = '9'; //注意这里是字符'9'
        }
        return stoi(s);
    }
};

总结

  • 贪心有难也有易,并没有什么套路可言
  • 需要找局部最优,从而推出全局最优,并且没有反例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值