[LeetCode]--Monotone Increasing Digits

这道LeetCode题目要求找到不超过给定非负整数N的最大递增数。文章通过将数字转换为字符串,逐位处理并检查相邻数字是否满足递增条件,来实现算法。如果找到不满足条件的数位,会将该位置及其后的数位调整为满足递增且最大的组合。算法的时间复杂度为O(n),其中n为整数的位数。
摘要由CSDN通过智能技术生成

题目

Given a non-negative integer N, find the largest number that is less than or equal to N with monotone increasing digits.

(Recall that an integer has monotone increasing digits if and only if each pair of adjacent digits x and y satisfy x <= y.)

Example 1:

Input: N = 10
Output: 9

Example 2:

Input: N = 1234
Output: 1234

Example 3:

Input: N = 332
Output: 299

Note: N is an integer in the range [0, 10^9].

中文题意:找到不超过给定数N的最大的递增数。递增数是指后一位大于或等于前一位的数。

分析

   由于对整数中单个数位的处理较为繁琐,因此,本题中先把所给整数转换为string类型,对于每一个char字符进行处理,这样可以减少计算量,在最终通过stoi函数将string转为整型数即可。
      首先遍历字符串的每一位,从原数字的高位开始,若前一位不大于后一位,则证明整数N已经是一个递增数,直接返回整数N即可;若前一位大于后一位,则跳出遍历,处理其后的所有数位。
      对于所给整数中不满足条件的数位,我们先记录不满足条件的位置,然后将最高的与该位置数值相同的数位的数值减1,再将其后所有数位设置为9(如例3)。这样既满足了递增数的要求,又满足了最大递增数的条件。
      此算法的时间复杂度为O(n),其中n为整数的位数。

解答

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string str=to_string(N);
        int i;
        int length=str.size();
        for(i=0;i<length-1;i++){
            if(str[i]>str[i+1]){
                break;
            }
        }
        if(i==length-1)
            return N;
        while(i>=1 && str[i-1]==str[i]){
            i=i-1;
        }
        str[i]=str[i]-1;
        i=i+1;
        for(;i<length;i++){
            str[i]='9';
        }
        return stoi(str);
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值