leetcode-036-738. 单调递增的数字

该博客讨论了如何在给定整数N内找到最大的单调递增整数的算法。通过遍历数字并检测逆转位,将逆转位之前的数字置为0来实现。示例展示了算法在不同输入下的输出,并提供了代码实现。优化后的算法避免了暴力搜索,提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:

输入: N = 10
输出: 9

示例 2:

输入: N = 1234
输出: 1234

示例 3:

输入: N = 332
输出: 299

说明: N 是在 [0, 10^9] 范围内的一个整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力是最简单的想法,但是时间卡的很死。所以必须优化:
7200 最近的答案是:7-1, 其余为 9, 即 6900。

我选择使用数字的方式,而不是字符串。数字的方式其实就是 9 不好填,那我就填 0 嘛:
7 不减一, 其余填 0, 7000。 这个操作很容易。

  1. 遍历数字, 遇到逆转位,逆转位之前都归为 0

实现也很优美:


class Solution {
public:
    
    int check(int num) {
        if(num<10)
            return -1;
        
        int k = 0;  //标记走了多少位置
        int last = num %10;
        while(num!=0 && last >= num%10) {
            last = num % 10;
            num = num / 10;
            k++;
        }
        
        if(num == 0)
            return -1;
        else
            return num*pow(10, k);
    }

    int monotoneIncreasingDigits(int N) {
        for(int num=N; num>=0; num--) {
            int tmp = check(num);
            if( tmp == -1)
                return num;
            else
                num = tmp;
        }

        return 0;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值