(一)递归的全排列算法
(A、B、C、D)的全排列为
1、A后面跟(B、C、D)的全排列
2、B后面跟(A、C、D)的全排列
3、C后面跟(A、B、D)的全排列
4、D后面跟(A、B、C)的全排列
而对1中的(B、C、D)照样可以按照上面的形式进行分解。
/**
*
*/
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* @author MohnSnow
* @time 2015年6月29日 下午2:21:40
*
*/
public class permutation {
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * @param nummengdx
<span style="white-space:pre"> </span> * -fnst
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>//LeetCode31---http://blog.csdn.net/bingbing8219/article/details/46504475
<span style="white-space:pre"> </span>//数学方法去做题----374msAC
<span style="white-space:pre"> </span>private static void nextPermutation(int[] nums) {
<span style="white-space:pre"> </span>int len = nums.length;
<span style="white-space:pre"> </span>int i = len - 1;
<span style="white-space:pre"> </span>while (i > 0) {
<span style="white-space:pre"> </span>if (nums[i] <= nums[i - 1]) {
<span style="white-space:pre"> </span>i--;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (i == 0) {
<span style="white-space:pre"> </span>Arrays.sort(nums);
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>int j = len - 1;
<span style="white-space:pre"> </span>while (j > i - 1) {
<span style="white-space:pre"> </span>if (nums[j] > nums[i - 1]) {
<span style="white-space:pre"> </span>int temp = nums[j];
<span style="white-space:pre"> </span>nums[j] = nums[i - 1];
<span style="white-space:pre"> </span>nums[i - 1] = temp;
<span style="white-space:pre"> </span>Arrays.sort(nums, i, len);
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>j--;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>System.out.println(Arrays.toString(nums));
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//LeetCode46---http://blog.csdn.net/bingbing8219/article/details/46619591
<span style="white-space:pre"> </span>//递归算法,求出所有排列组合,未按顺序排序
<span style="white-space:pre"> </span>public static void permutationSum(int[] num, int begin, int end) {
<span style="white-space:pre"> </span>if (begin == end) {
<span style="white-space:pre"> </span>for (int i = 0; i < num.length; i++) {
<span style="white-space:pre"> </span>System.out.print(num[i] + "");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>System.out.println("");
<span style="white-space:pre"> </span>return;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>for (int i = begin; i <= end; i++) {
<span style="white-space:pre"> </span>swap(num, i, begin);
<span style="white-space:pre"> </span>permutationSum(num, begin + 1, end);
<span style="white-space:pre"> </span>swap(num, i, begin);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void swap(int[] num, int i, int begin) {
<span style="white-space:pre"> </span>int temp = num[i];
<span style="white-space:pre"> </span>num[i] = num[begin];
<span style="white-space:pre"> </span>num[begin] = temp;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//非递归算法,求出所有排列组合
<span style="white-space:pre"> </span>public static LinkedList<List<Integer>> permutationSum1(int[] nums) {
<span style="white-space:pre"> </span>LinkedList<List<Integer>> res = new LinkedList<List<Integer>>();
<span style="white-space:pre"> </span>res.add(new ArrayList<Integer>());
<span style="white-space:pre"> </span>for (int n : nums) {
<span style="white-space:pre"> </span>int size = res.size();
<span style="white-space:pre"> </span>for (; size > 0; size--) {
<span style="white-space:pre"> </span>List<Integer> r = res.pollFirst();
<span style="white-space:pre"> </span>for (int i = 0; i <= r.size(); i++) {
<span style="white-space:pre"> </span>List<Integer> t = new ArrayList<Integer>(r);
<span style="white-space:pre"> </span>t.add(i, n);
<span style="white-space:pre"> </span>res.add(t);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return res;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//LeetCode47---http://blog.csdn.net/bingbing8219/article/details/46621359
<span style="white-space:pre"> </span>//递归算法,求出所有排列组合,去除重复排序
<span style="white-space:pre"> </span>public static void permutationSum2(int[] num, int begin) {
<span style="white-space:pre"> </span>if (begin == num.length - 1) {
<span style="white-space:pre"> </span>for (int i = 0; i < num.length; i++) {
<span style="white-space:pre"> </span>System.out.print(num[i] + "");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>System.out.println("");
<span style="white-space:pre"> </span>return;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>for (int i = begin; i <= num.length - 1; i++) {
<span style="white-space:pre"> </span>if (i > begin && num[i] == num[i - 1]) {
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>swap(num, i, begin);
<span style="white-space:pre"> </span>permutationSum2(num, begin + 1);
<span style="white-space:pre"> </span>swap(num, i, begin);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>int[] num = { 1, 2, 2 };
<span style="white-space:pre"> </span>System.out.println("--------下一个排序序列是:nextPermutation()------");
<span style="white-space:pre"> </span>nextPermutation(num);
<span style="white-space:pre"> </span>System.out.println("--------递归列出所有序列是:permutationSum()------");
<span style="white-space:pre"> </span>permutationSum(num, 0, num.length - 1);
<span style="white-space:pre"> </span>System.out.println("--------递归列出所有序列是:permutationSum2()(去重)------");
<span style="white-space:pre"> </span>System.out.println("--------去重前需要先排序一下------");
<span style="white-space:pre"> </span>Arrays.sort(num);
<span style="white-space:pre"> </span>permutationSum2(num, 0);
<span style="white-space:pre"> </span>System.out.println("--------非递归列出所有序列是:permutationSum1()------");
<span style="white-space:pre"> </span>System.out.println("permutationSum1: " + permutationSum1(num).toString());
<span style="white-space:pre"> </span>}
}