2020-12-15 单调递增的数字
题目
解题方法
贪心法
采用贪心的思想解决该问题,对于输入\(N\),先将其转换为字符串\(digit\)(方便索引与修改)。
从高位向低位遍历,直至碰到第一个元素\(digit[i]\),使得\(digit[i]>=digit[i-1]\),将\(digit[i-1]\)的值减去\(1\),再将低位上的数都改为\(9\)。但是,可能碰到这种情况:\(digit[i-1]\)减掉\(1\)后使得\(digit[i-1]<digit[i-2]\),因而破坏了单调递增的条件,因此在进行了上述操作之后,还要往前回溯直到找到下标\(j\left(0<j<digit.size()\right)\)使得\(digit[j]-1 >= digit[j-1]\),然后将\(j\)之后的低位上的数都改为\(9\)。
class Solution {
public:
int monotoneIncreasingDigits(int N) {
if (N < 10)
return N;
string digit = to_string(N); // 将N转化为字符串
int i = 1;
while (i < digit.size() && digit[i-1] <= digit[i]) {
i++; // 从高位往低位遍历,寻找破坏单调递增条件的元素
}
if (i < digit.size()) { // 若找到了
while (i > 0 && digit[i-1] > digit[i]) {
digit[i-1] -= 1;
i--;
}
for (i += 1; i < digit.size(); i++) {
digit[i] = '9';
}
}
return stoi(digit); // 将字符串转换为整数
}
};
提交结果
总结
在解决本题时使用了贪心的思想,从高位往低位遍历,尽可能地使得到的值最大。
在编写代码时使用了两个库函数to_string()
与stoi()
,这两个函数的LLVM实现在这里。
努力看了一下实现源码,发现看不懂:(,待以后进一步学习C++模板等内容了再看吧。
CS专业在读,热爱编程。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。