排列与组合的JAVA通用算法

排列算法

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]);   
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值