• 贪心算法学习——单调递增的数字


    一,单调递增的数字

    1.题目

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

    给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

    示例 1:

    输入: n = 10
    输出: 9
    

    示例 2:

    输入: n = 1234
    输出: 1234
    

    示例 3:

    输入: n = 332
    输出: 299
    

    2.题目接口

    1. class Solution {
    2. public:
    3. int monotoneIncreasingDigits(int n) {
    4. }
    5. };

    3.解题思路及其代码

    暴力法解题步骤:

    1.首先用for循环从n开始遍历直到遍历到0.

    2.将遍历到的数字转换成字符串(使用to_string)。

    3.使用while循环用两个指针指向字符串的前后两位,如果前面的大于后面的字符便break。如果不是便继续移动指针知道到了字符串的结尾。

    3.出来时判断一下我的第二个字符串是否指向str.size()位,如果是便返回这个数字。如果不是便继续循环。

    代码如下:

    1. class Solution {
    2. public:
    3. int monotoneIncreasingDigits(int n) {
    4. for(int i = n;i>=0;i--)
    5. {
    6. string str = to_string(i);
    7. int pre = 0;
    8. int last = 1;
    9. while(lastsize())
    10. {
    11. if(str[pre]>str[last])
    12. {
    13. break;
    14. }
    15. pre++;
    16. last++;
    17. }
    18. if(last == str.size())
    19. {
    20. return i;
    21. }
    22. }
    23. return -1;
    24. }
    25. };

    但是提交以后会超时:

    这就说明我们的思路是对的但是我们的代码还需要改进一下。

    贪心解法步骤:

    先来举个例子:

    n == 1234158,这时我们该输出什么答案呢?经过计算可知答案应该是:1233999

    n == 1255516,  这时我们该输出什么答案呢?经过计算可知答案应该是:  1249999

    n == 1101,      这时我们该输出什么答案呢?经过计算可知答案应该是:     999

    从这些例子可以发现,我们的比n小找到一个最大的递增数字的操作是:

    1.先从零下标开始找到最大的递增下标。

    2.找到后看看前面有没有连续相等的情况,若有便往前找,找到下标最小连续相等的情况。

    3.开始将找到的这个下标减1,再将这个下标后面的数字都变成9.

    代码如下:

    1. class Solution {
    2. public:
    3. int monotoneIncreasingDigits(int n) {
    4. string str = to_string(n);//将n转换成字符串
    5. int m = str.size();//计算长度
    6. int i = 0;
    7. while(i+1<=m&&str[i]<=str[i+1])i++;//递增便++i.
    8. if(i+1 == m)//若这个字符完全都是递增的便直接返回
    9. {
    10. return stoi(str);
    11. }
    12. while(i-1>=0&&str[i-1]==str[i])i--;//若有连续相等的便找到最小下标的那个数
    13. str[i]--;//改变这个数,若是0便会变成-1,会被舍弃掉减小位数。
    14. for(int j = i+1;j//将后面的变为9便可以得到最大的递增序列。
    15. {
    16. str[j] = '9';
    17. }
    18. return stoi(str);//转为数字返回
    19. }
    20. };

    过啦:

  • 相关阅读:
    Linux篇15进程间通信之共享内存&&浅谈消息队列&&浅谈信号量
    Camunda 7.x 系列【51】运行时服务 RuntimeService
    怎么样去图片水印?用这三招快速消除水印
    粗糙集知识约简的python代码
    「PAT乙级真题解析」Basic Level 1099 性感素数 (问题分析+完整步骤+伪代码描述+提交通过代码)
    【前端知识】Three 学习日志(四)—— 相机控件
    3.0、软件测试——测试用例
    AnimeSR:可学习的降质算子与新的真实世界动漫VSR数据集
    微软黑科技如何加速游戏开发,读这篇就够了
    HyperLynx(三)传输线类型及相关设置
  • 原文地址:https://blog.csdn.net/qq_41934502/article/details/134029326