leetcode:738. 单调递增的数字(贪心)

题目:

在这里插入图片描述

分析:

贪心策略很明确,一个数大要保证其最高位最大。
考虑限制因素:
每一位所受的限制因素(1) 所给数字 (2)其后的数字
为什么没有前面的呢?因为是尽可能的大,要保障的是我大到后面的数字也是可以取值的,

再详细:
(1) 如果你本身是递增的,那么我就取你本身。
(2)本身不是递增。最高位一定要减一吗?
不是:398 3245 345654
发现了吗?和递减开始处有关。
因此解题思路,找到从头开始的递增段,而且要保证最后的那段递增是不等于的递增。 递增段不变,递减段开始处(即递增的最后一处)减一,后面全部取999999.

nice

代码:

 string st;
 stringstream ss1;
 int N;
 ss1<<N;
 ss1>>st;
 //寻找转折点。
 int zhe=-1;
 for(int i=0;i<st.size()-1;i++)
 {
  if(st[i]>st[i+1])
  {
   if(i!=0)
   {
    while(1)
   {
    if(st[i]==st[i-1]) i--;
    else break;
   }
   zhe=i;
   }
   else zhe=0;
   break;
  }
 } 
 if(zhe=-1) return N;
 zhe=st.size()-zhe-1;
 int n=N;
 n=n/pow(10,zhe)-1;
 for(int i=0;i<zhe;i++)
 {
  n=n*10+9;
 }
 return n;

总结:

复习:

整数转化为字符串的方法:
在这里插入图片描述
字符串转化为整数:
在这里插入图片描述

该题目又是与递增递减转折有关啊!

发布了48 篇原创文章 · 获赞 20 · 访问量 607

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/104046226
今日推荐