day37
代码随想录
2024.1.4
1. 738单调递增的数字
这道题其实做法是有点找规律的,得判断变化得规律,首先如果满足条件直接返回原始值;
其次,如果不满足如果是ab,不满足,说明a>b,因为我们找的是小于ab的最大数,所以整体要减小,现在的变动无非就是a和b变大变小的问题,如果a不动,b再怎么变也不行啊,a增大就更扯了,因此结论,a是一定要减小的!因为要找最大的,所以,a减小1就好,那么,a减小后,b呢?还是同理,要最大!所以b直接为9就好,一定满足a<=b;这就是局部最优的逻辑。然后整体遍历就好,不过还有一点要注意的,遍历顺序要从右往左,原理跟那个分发糖果类似,就不再细说了。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
// flag用来标记赋值9从哪里开始
// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
int flag = strNum.size();
for (int i = strNum.size() - 1; i > 0; i--) {
if (strNum[i - 1] > strNum[i] ) {
flag = i;
strNum[i - 1]--;
}
}
for (int i = flag; i < strNum.size(); i++) {
strNum[i] = '9';
}
return stoi(strNum);
}
};