排列与组合的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]); } } }}
阅读全文
0 0
- 排列与组合的JAVA通用算法
- 组合排列的通用算法
- 排列与组合的算法
- 排列与组合算法
- 排列与组合算法
- java组合排列算法
- 常用排列与组合的相关算法
- 排列与组合的算法实现
- 字符串的全排列与组合算法
- 排列与组合的Java递归实现
- 【算法基础】排列与组合
- java求组合排列算法
- java排列和组合算法
- Java实现通用组合算法
- Java实现通用组合算法
- Java实现通用组合算法
- Java实现通用组合算法
- 组合排列的javascript算法
- Java中Synchronized的用法
- 注释转换(C转C++注释符)
- 计蒜客 敲七,蒜头君买书
- 鱼C工作室《零基础入门学习Python》 学习过程笔记【011列表类的方法】
- Python 标准库一览(Python进阶学习)
- 排列与组合的JAVA通用算法
- 36. MySQL 命令
- 后来
- Linux系统的文件传输
- IPC之管道编程(1)
- 用KS和pxe自动安装linux系统
- 倒排索引
- POJ 1426 Find The Multiple
- 通过内容提供者获取手机上的音乐资源