738.单调递增的数字
首先需要将数字转换为字符串,这样才能对每一位数字进行操作。
整体思路就是:
不算遍历每一位,当出现s[i] < s[i-1]
时,将s[i-1]
减一,后面的数字都变为9;
但是如果从左到右遍历,容易出现s[i-1]-1之后比s[i-2]小的情况,例如 332,按照从左到右的顺序将变为 329,但是期望的值其实是299
所以应该从右往左遍历,不断利用上一次改变的结果,设置一个标志位记录第一次需要改变数字的第一位,然后将后面的数都变为9
class Solution {
public:
int monotoneIncreasingDigits(int n) {
if (n < 10) return n;
string s = to_string(n);
int flag = s.size();
for (int i = s.size() - 1; i > 0; i--) {
if (s[i-1] > s[i]) {
flag = i; //记录开始变为9的位置
s[i-1]--;
}
}
for (int i = flag; i < s.size(); i++) {
s[i] = '9'; //注意这里是字符'9'
}
return stoi(s);
}
};
总结
- 贪心有难也有易,并没有什么套路可言
- 需要找局部最优,从而推出全局最优,并且没有反例