day37|贪心算法6-单调递增数字

738.单调递增的数字

  1. 确定贪心思想: 贪心就是一次遍历,然后获取每一次遍历下符合条件的解。对于给定数值98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
  2. 确定遍历顺序: 分析如果向后遍历和向前遍历,两者之间会有什么不同,如果向前遍历容易使得修改完后边的值之后,前边的值发生变化。如果向后遍历可以很好的解决这一问题。
class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        # 首先可以想暴力法:遍历所有的比n小的数值,看这些数值是否能够满足递增的条件
        # 贪心算法:遍历出现可以修正的结果,则进行修改
        lst = list(str(n))
        for i in range(len(lst)-1,0,-1):
            if int(lst[i]) < int(lst[i-1]):
                lst[i-1] = str(int(lst[i-1])-1)
                # 这里需要注意要对该值之后所有的值全部赋值为9
                lst[i:] = '9' * (len(lst) - i)
        return int(''.join(lst))

总结

  • 主要有摆动序列、重叠区间、前后序列双重考虑等思想。
    请添加图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值