单调递增的数字之贪心算法

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

贪心策略:

  1. 情况1:1234的递增的,直接不变
  2. 情况2:12321的3>2,所以3要减一,后面的所有位变成9,满足最大有递增,满足题意
  3. 情况3:特例,123321,中要为122999,而非123299,所以要记录本位连续相同个数
  4. 从左到右,当高位等于次高位,重复数k加一;否则,小于,不变,k置为零。大于本位前k位减一,后边全为9,结束。
    时间复杂度:O(n)

数据分析:
一个数组:存放每位数值
一个k变量:记录本位之前数值连续相同个数
一个m:计算结果
空间复杂度:O(n)

代码:

class Solution:
    def monotoneIncreasingDigits(self, N: int) -> int:
        N=str(N)
        N=[int(i) for i in N]
        k=0
        for i in range(len(N)-1):
            if N[i]>N[i+1]:
                N[i-k]-=1
                for j in range(i+1-k,len(N)):
                    N[j]=9
                else:
                    break
            if N[i]==N[i+1]:
                k+=1
            else:
                k=0            
                    
        m=N[-1]
        j=0
        for i in range(len(N)-1,0,-1):
            m+=N[j]*pow(10,i)
            j+=1
        return m
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值