标签:string int 整体 strNum 738 Leetcode 解法 贪心
文章目录
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。