问题1:
生成1-n的排列,采用递归,解决思想:先输出所有以1开头的排列,然后输出以2开头的排列....最后输出以n开头的排列
问题2:
输入数组P,并按照字典序输出所有全排列。注意数组P中的数可能重复。修改问题1中代码即可实现。
问题1对应:easyPermutationPrint(int n, int[] A, int cur)函数,问题2:对应peasyPermutationPrint(int n, int[] P, int[] A, int cur) 函数。
Java实现代码如下:
转载时请注明来源:http://blog.youkuaiyun.com/ccfeng2008
代码测试通过
package permutation;
import static java.lang.System.out;
import java.util.Arrays;
public class Permutation {
public static void easyPermutationPrint(int n, int[] A, int cur) {
if (cur == n) {
for (int i = 0; i < n; i++) {
if (i == n - 1)
out.println(A[i] + 1);
else
out.print((A[i] + 1) + " ");
}
} else {
for (int i = 0; i < n; i++) {
boolean ok = true;
for (int j = 0; j < cur; j++)
if (A[j] == i)
ok = false;
if (ok) {
A[cur] = i;
easyPermutationPrint(n, A, cur + 1);
}
}
}
}
public static void easyPermutationPrint(int n, int[] P, int[] A, int cur) {
if (cur == n) {
for (int i = 0; i < n; i++) {
if (i == n - 1)
out.println(A[i]);
else
out.print(A[i] + " ");
}
} else {
for (int i = 0; i < n; i++)
if (i == 0 || P[i] != P[i - 1]) {
int c1 = 0, c2 = 0;
for (int j = 0; j < cur; j++)
if (A[j] == P[i])
c1++;
for (int j = 0; j < n; j++)
if (P[j] == P[i])
c2++;
if (c1 < c2) {
A[cur] = P[i];
easyPermutationPrint(n, P, A, cur + 1);
}
}
}
}
public static void main(String[] args) {
// easyPermutationPrint(10, new int[10], 0);//问题1输入方式
int[] p = { 1,2,2 };
Arrays.sort(p);
easyPermutationPrint(p.length, p, new int[p.length], 0);//问题2输入方式
}
}