题目链接:738. 单调递增的数字
思路一:暴力破解,每次减1一个一个数判断
class Solution {
//暴力破解
//时间复杂度:O(nm) m为n的数字长度
//空间复杂度:O(1)
public:
bool checkNum(int num) {
int low_pos = 10;
while (num) {
int temp_pos = num % 10;
if (low_pos >= temp_pos) low_pos = temp_pos;
else return false; //如果低位比高位小 false
num = num / 10;
}
return true;
}
int monotoneIncreasingDigits(int N) {
for (int i = N; i > 0; i--) { //一个一个判断
if (checkNum(i)) return i;
}
return 0;
}
};
思路二:贪心
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string strNum = to_string(N); //数字转字符串 string头文件的函数
// 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; //后一位改9
strNum[i - 1]--; //332 -> 322 -> 222
}
}
for (int i = flag; i < strNum.size(); i++) { //标记位置开始改9
strNum[i] = '9';
}
return stoi(strNum); //字符串转数字
}
};