比如63543,这个数包含6,3,5,4,3,将这些数字重新组合以后,产生下一个较大的数字,那么就是64335。
这个问题在career cup上看到的,网上没有解答。想了一个办法,应该是没问题的。
其实题目的描述就已经给出了一个解法,就是穷举法。比如输入数字为n,将这个数字每个位上的数字求出来,存在一个数组里,然后产生它的所有排列。那么时间复杂度就是O(n!)。空间复杂度为O(log_10 n)。
下面介绍一种较好的求解方法。
观察这个数字63543,求出第一个逆序对,也就是63543。如果直接交换这两个逆序对,然后将剩下的数字升序排序,产生65334,不是所求。观察发现,如果用第一个逆序数字3与之前的有序数字中的4交换,得到64533,然后再升序排序一下之前的有序部分,得到64335,既为所求。
以下是Java实现:
import java.util.Stack;
import java.util.Random;
public class NextHigher {
public static void swap(int[] a, int m, int n) {
if (a[m] != a[n]) {
a[m] ^= a[n];
a[n] ^= a[m];
a[m] ^= a[n];
}
}
public static int partition(int[] a, int l, int h) {
int i = l - 1;
int pivot = a[h];
for (int j = l; j <= h; j++) {
if (a[j] < pivot) {
i++;
swap(a, i, j);
}
}
sw