【代码随想录day 31】 力扣 738.单调递增的数字
视频讲解:https://www.bilibili.com/video/BV1Kv4y1x7tP/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/monotone-increasing-digits/
这道题还挺难想的,主要思路如下
- 如果从后往前遍历。前一位小于后一位自然是好的,直接输出,但是如果前一位大于后一位,我们就需要让前一位–,后一位就可以置为9了这样才是最大的。
- 一旦有一位变为9,后续都可以变为9,因此我们需要记录从哪里开始后续都变成9,也就是flag位
- 从后往前遍历完之后,再从flag位遍历到最后,将每一位都变为9即可。
class Solution {
public:int monotoneIncreasingDigits(int n) {//先将输入的n转为string类型string strNum = to_string(n);//设置flag用来标记从哪一位到最后都变成9int flag = strNum.size();//从后往前遍历,如果是逐步变小就不变,如果前一位大于后一位就把前一位数值--,同时标记后一位开始到最后可以变为9for(int i = strNum.size() - 1; i > 0; --i){if(strNum[i - 1] > strNum[i]){flag = i;strNum[i - 1]--;}}//将flag开始到最后的所有位全变为9for(int i = flag; i < strNum.size(); ++i){strNum[i] = '9';}return stoi(strNum);}
};