738. 单调递增的数字

这个一般性的规律我是找到了,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9。
但我总是开始想的是,局部最优就是全局最优了,因此总是纠结于局部细节缝缝补补,结果还错了。
但这贪心算法是从局部最优推出全局最优,因此就是一个遍历递推的过程。
后面数字要全部变成9,这个也不是一个一个改,而是找到一个范围一起改,因此就需要一个变量来记录位置。
其次C++中数字转字符,字符转数字有简单的库函数。
string strNum = to_string(N);
stoi(strNum);
完整代码:
点击查看代码
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);
}
};

浙公网安备 33010602011771号