给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n)。
例如:
给定1233,它的下一个是1323;
给定1323,它的下一个是1332;
给定9876,它的下一个不存在;
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
bool cmp(int a, int b) {
return a < b;
}
void solve(int num) {
int a[1000], len = 0, min = 1000000, temp = num;
do{
a[len++] = num % 10;
num /= 10;
} while(num != 0);
sort(a, a + len,cmp);
do {
int sum = 0, s = 1;
for(int i=0; i < len; i++) {
sum += a[i] * s;
s *= 10;
}
if(sum > temp)
if(sum < min)
min = sum;
} while(next_permutation(a, a + len));
if(min == 1000000) {
printf("不存在");
return;
}
printf("%d", min);
}
int main() {
int num = 9876; //9876:不存在 //1233:1323 //1323:1332
solve(num);
return 0;
}
O(n)的代码不会。。