排列与组合的JAVA通用算法

来源:互联网 发布:php 积分商城 开源 编辑:程序博客网 时间:2024/06/04 19:14

排列算法

1.例如,输入n,求1-n的全排列。一共有n*(n-1)*(n-2)…*1种排列(n个数两两不相同)

//采用递归地方式实现,就是回朔法public class Rank {    private static Set<Integer>set=new HashSet<Integer>();//用于判断数字是否已经用过    private static int n=0;//输入的n,求1-n的全排列    private static int count=0;    public static void main(String [] args){         Scanner sc=new Scanner(System.in);         n=sc.nextInt();//输入n,求1-n的全排列         int a[]=new int[n+1];        dfs(a, 1, set);        System.out.println("一共有"+count+"种排列");        sc.close();    }public static void dfs(int a[] ,  int  index,Set<Integer>set){                  if(index==n+1){                      for(int i=1;i<=n;i++){                          System.out.print(a[i]+" ");                                             }                      System.out.print("\n");                                       count++;                      return;                  }         for(int i=1;i<=n;i++){              if(!set.contains(i)){//判断当前的这个数是否已经用过                  set.add(i);//这个数用过了                  a[index]=i;//将用了的数存在a数组                  dfs(a,index+1,set);//递归计算下一个数                  set.remove(i);//递归完成,收回已经用过的数,下一次重新排列              }               }  }}

2.输入一个数字n,然后输入n个数,这n个数有哪些排列方式呢?(和第一题差不多,两两不相同)

//采用递归地方式实现,就是回朔法public class Rank {    private static Set<Integer>set=new HashSet<Integer>();//用于判断数字是否已经用过    private static int n=0;//输入的n,求1-n的全排列    private static int count=0;    public static void main(String [] args){         Scanner sc=new Scanner(System.in);         n=sc.nextInt();//输入n,求1-n的全排列         int a[]=new int[n];//声明n个数组a         for (int i = 0; i <n; i++) {            a[i]=sc.nextInt();        }         int b[]=new int[n];        dfs(a,b, 0, set);        System.out.println("一共有"+count+"种排列");        sc.close();    }public static void dfs(int a[] , int b[], int  index,Set<Integer>set){                  if(index==n){                      for(int i=0;i<n;i++){                          System.out.print(b[i]+" ");                                             }                      System.out.print("\n");                                       count++;                      return;                  }         for(int i=0;i<n;i++){              if(!set.contains(a[i])){//判断当前的这个数是否已经用过                  set.add(a[i]);//这个数组用过了                  b[index]=a[i];//将用了的数存在b数组                  dfs(a,b,index+1,set);//递归计算下一个数                  set.remove(a[i]);//递归完成,收回已经用过的数组,下一次重新排列              }         }  }}

组合算法

3.输入n,接着输入n个数,求这n个数组成3个一组,共多少种,分别是什么(例如:1 3 2和 1 2 3为同一种组合)

public class DFS {    private static int n=0;    private static int count=0;    private static Set<Integer>set=new HashSet<Integer>();    private  static int b[]=new int[5];//存放组合方式,因为3个一组,所以开辟5个数组就够了    public static void main(String[] args){    Scanner sc=new Scanner(System.in);     n=sc.nextInt();    int a[]=new int[n];    for(int i=0;i<n;i++){           a[i]=sc.nextInt();    }    for(int i=0;i<n-2;i++){        b[0]=a[i];        set.add(a[i]);//以当前的第一个数开始回朔,达到去重的效果         dfs(a,i, 1);    }  System.out.println(count);    }    public static void dfs(int a[],int start, int index){                       if(index==3){                           for(int i=0;i<3;i++){                               System.out.print(b[i]+" ");                           }                           count++;                           System.out.print("\n");                           return ;                       }        for(;start<n;start++){            if(!set.contains(a[start])){                        b[index]=a[start];                set.add(a[start]);                dfs(a,start, index+1);                set.remove(a[start]);               }        }    }}

4.在三题的基础上优化:

import java.util.ArrayList;import java.util.HashSet;import java.util.Scanner;import java.util.Set;public class DFS {    private static int n=0;    private static int count=0;    private static Set<Integer>set=new HashSet<Integer>();    private  static int b[]=new int[5];    public static void main(String[] args){    Scanner sc=new Scanner(System.in);     n=sc.nextInt();    int a[]=new int[n];    for(int i=0;i<n;i++){           a[i]=sc.nextInt();    }    dfs(a, 0, 0); System.out.println(count);    }    public static void dfs(int a[],int start, int index){                       if(index==3){                           for(int i=0;i<3;i++){                               System.out.print(b[i]+" ");                           }                           count++;                           System.out.print("\n");                           return ;                       }        for(;start<n;start++){            if(!set.contains(a[start])){                        b[index]=a[start];                set.add(a[start]);                dfs(a,start, index+1);                set.remove(a[start]);               }        }    }}
原创粉丝点击