算法基础---全排列算法
2015-06-29 14:43
246 查看
(一)递归的全排列算法
(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)照样可以按照上面的形式进行分解。
(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>} }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- PHP排序算法类实例