排列算法
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]);
}
}
}
}