问题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.csdn.net/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输入方式 } }