这道题其实就是看给出的数字的各个位上的数字是否为递增的,如果为递增,就直接不变,不是的话,就输出比它小的最大递增数字(其实就是最大位减一,然后其余位变成9)
为什么会有flag这个量出现?直接修改不行嘛?
——不行,假如1000的话,直接修改的话会是900,因为条件中不包含等于,但这不是最大的
void itoa(int num, char* str, int* strSize){
*strSize = 0;
while(num > 0){
str[(*strSize)++] = num % 10 + '0';
num /= 10;
}
for(int i = 0; i < (*strSize)/2; i++){
int temp = str[i];
str[i] = str[(*strSize) - 1 - i];
str[(*strSize) - 1 - i] = temp;
}
str[* strSize] ='\0';
}
int monotoneIncreasingDigits(int n) {
int strNSize;
char strN[11];
itoa(n, strN, &strNSize);
int flag = strNSize;
for(int i = strNSize - 1; i > 0; i--){
if(strN[i - 1] > strN[i]){
flag = i;
strN[i - 1]--;
}
}
for(int i = flag; i < strNSize; i++){
strN[i] = '9';
}
return atoi(strN);
}
贪心算法总结
贪心算法没有套路可以讲,更多是看人对问题的思考,这里其实通过大量题目练习后,然后找到了了一种思路,我觉得贪心算法就是解决方法中比较巧妙的解题方法