day37贪心(6)

day37
代码随想录
2024.1.4

1. 738单调递增的数字
这道题其实做法是有点找规律的,得判断变化得规律,首先如果满足条件直接返回原始值;
其次,如果不满足如果是ab,不满足,说明a>b,因为我们找的是小于ab的最大数,所以整体要减小,现在的变动无非就是a和b变大变小的问题,如果a不动,b再怎么变也不行啊,a增大就更扯了,因此结论,a是一定要减小的!因为要找最大的,所以,a减小1就好,那么,a减小后,b呢?还是同理,要最大!所以b直接为9就好,一定满足a<=b;这就是局部最优的逻辑。然后整体遍历就好,不过还有一点要注意的,遍历顺序要从右往左,原理跟那个分发糖果类似,就不再细说了。

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);
    }
};
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值