递归算法实现全排列
来源:互联网 发布:ifconfig修改mac地址 编辑:程序博客网 时间:2024/04/30 14:36
import java.util.*;public class Perm{//采用递归算法实现全排列public static void perm(int[] arr,int[] used,LinkedList<Integer>stack){boolean flag = true;for(int i=0;i<arr.length;i++){if(used[i]==0){flag = false;used[i] = 1; //used[]用来标记arr中对应元素是否已经被使用stack.push(arr[i]); //采用栈的数据结构保存找到的排列perm(arr,used,stack);used[i] = 0;//回退的过程中清除标记stack.pop();//相应的从结果栈中清除}}if(flag){//全部元素都已用到for(int e:stack){System.out.print(e+" ");}System.out.println();}}public static void main(String[] args){int[] arr = {1,2,3,4,5};int[] used = new int[arr.length];LinkedList<Integer> stack = new LinkedList<>();perm(arr,used,stack);}}
这种方法比较好理解,但是需要2倍的额外空间,为了解决空间浪费的问题,可以采用下面这种方法
/**(A、B、C、D)的全排列为1、A后面跟(B、C、D)的全排列2、B后面跟(A、C、D)的全排列3、C后面跟(A、B、D)的全排列4、D后面跟(A、B、C)的全排列*/class Perm2 {public static int count =0;public static void perm(int[] arr,int begin){for(int i = begin; i < arr.length; i++){if(begin == arr.length-1){for(int e:arr){System.out.print(e+"");}System.out.println();count++;}else{swap(arr,begin,i);perm(arr,begin+1);swap(arr,begin,i);}}}public static void swap(int[] arr,int i,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] arr = {1,2,3,4,5};perm(arr,0);System.out.println("排列总数 "+count);}}
这种方法不需要额外的空间,两种方法时间复杂度都很高。
0 0
- 递归算法实现全排列
- 全排列算法递归实现
- 【算法】递归实现全排列
- 全排列--递归算法实现
- 递归算法实现全排列
- 递归算法实现全排列
- 全排列递归实现算法
- 算法——全排列递归实现
- 递归实现的全排列算法
- 全排列算法之非递归实现
- 全排列算法的非递归实现
- 全排列算法(字典序,递归实现)
- 全排列算法递归实现(可重集)
- 全排列递归算法的实现
- 全排列递归算法(C++实现)
- 使用递归实现全排列的算法
- 全排列算法的递归实现
- 全排列的递归实现算法
- 揭开linux内核中container_of的神秘面纱
- Linux inotify的功能及实现原理
- 贫血模型和充血模型
- Codeforces Round #145 (Div. 1, ACM-ICPC Rules)A
- 学习Java的第一天
- 递归算法实现全排列
- JAVA API 异常处理
- nyoj586||poj2456 二分+贪心
- 搭建Web项目
- Symmetric Tree
- 传感器
- 例题3-2
- doFilter如何使用
- HDU ACM 1286-找新朋友-欧拉phi函数