其他分享
首页 > 其他分享> > 【Leetcode贪心序列问题三】738. 单调递增的数字

【Leetcode贪心序列问题三】738. 单调递增的数字

作者:互联网

文章目录

Leetcode738

1.问题描述

在这里插入图片描述

2.解决方案

解法一:暴力

暴力解法不必多说,就遍历小于等于N的每一个数,并判断是否单调递增即可,代码也很简单这里就不给出了

解法二:贪心(通过个例推断整体)

思路:

1.首先除了暴力,我们好像很难想到其他入手点,说白了就是我们很难通过给的N,去局部改变一个比如说四位数的几个位数,然后实现这个递增的数,说白了遇见98,76,87我们该怎么变化能改变局部又不影响整体的递增,这一谈到局部整体很明显就是贪心一类了
2.那么大胆一点98->89 76->69 87->79,也就是第一个数减一,第二个数直接变9,这一点我们想到了,但又往往觉得对于一个四五位数的数这样做整体会不会不对呀,每当有这种想法我们就想一想一个o(N)的算法就是得这样局部进而辐射整体,不然怎么o(N),于是我们带入一个四五位数的数发现还真可以
3.当然要注意一个细节就是100->99 87777->79999,也就是找到最高位是9的位数,后面统一赋为9

总结:

1.好了,题做出来了,那有什么值得我们借鉴的呢,本体思路我们当然已经记住了,以后出现类似的不必多说,more,遇到不太会的题,我们不能要求一下子想出来一个算法就把问题解决了,而是要想着一点一点解决,比如举三个特例总结出来点什么东西,然后看看是否能从局部推出整体(也是举例子),没准问题就解决了,理解这个算法我想再简单不过了,难得是下一次遇见类似或不类似的思考的角度是怎样的
2.贪心不像dp,回溯等有那么强的套路性,而更多的是秉持的一个思想去开阔的想问题

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        //to_string
        string strNum= to_string(n);
        int flag=strNum.size();
        for(int i=strNum.size()-1;i>=1;i--){
            if(strNum[i-1]>strNum[i]){
                strNum[i-1]--;
                //strNum[i]='9';
                flag=i;
            }
        }
        for(int i=flag;i<strNum.size();i++){
            strNum[i]='9';
        }
        return stoi(strNum);
    }
};

标签:string,int,整体,strNum,738,Leetcode,解法,贪心
来源: https://blog.csdn.net/qq_46514118/article/details/120542171