用Java实现给a[n]数组进⾏全排序,找到⼀个组合的前⼀个组合,⽐如a[3]{[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]},给出[2,3,1,],找到他的前序是[2,1,3]
时间: 2023-10-16 15:31:59 浏览: 81
这个问题可以使用字典序算法来解决。具体思路如下:
1. 从右往左扫描数组a,找到第一个不满足a[i] < a[i+1]的位置i。
2. 在i的右边,从右往左扫描,找到第一个大于a[i]的位置j。
3. 交换a[i]和a[j]。
4. 将i+1到结尾的子数组a[i+1:]翻转。
这样就得到了a的下一个排列。重复这个过程,直到找到给定排列的前一个排列。
下面是Java代码实现:
```java
public static int[] prevPermutation(int[] a) {
int i = a.length - 2;
while (i >= 0 && a[i] < a[i+1]) {
i--;
}
if (i >= 0) {
int j = a.length - 1;
while (j > i && a[j] >= a[i]) {
j--;
}
swap(a, i, j);
}
reverse(a, i+1, a.length-1);
return a;
}
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void reverse(int[] a, int start, int end) {
while (start < end) {
swap(a, start, end);
start++;
end--;
}
}
```
这个函数接受一个int数组a作为参数,返回a的前一个排列。如果a已经是最小排列了(例如[1,2,3]),则返回a的翻转(例如[3,2,1])。
阅读全文