题目
解题方法
贪心法
采用贪心的思想解决该问题,对于输入(N),先将其转换为字符串(digit)(方便索引与修改)。
从高位向低位遍历,直至碰到第一个元素(digit[i]),使得(digit[i]>=digit[i-1]),将(digit[i-1])的值减去(1),再将低位上的数都改为(9)。但是,可能碰到这种情况:(digit[i-1])减掉(1)后使得(digit[i-1]<digit[i-2]),因而破坏了单调递增的条件,因此在进行了上述操作之后,还要往前回溯直到找到下标(jleft(0<j<digit.size()
ight))使得(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++模板等内容了再看吧。