常见的算法问题全排列
在我参加蓝桥杯时发现 大多数问题都可以采用暴力破解 所以这个时候我就想进行一下总结:
关于全排列问题的通用解法,比如:(无重复全排列)(有重复的选取) (从N个数中选取m个数 然后进行排列的问题)
我这里尝试总结一下:
比如一般问题喜欢问1-9有多少种全排列,那么代码如下
import java.util.Stack; public class Test1 { //应对全排列问题 //分为三种情况:无重复的全排列 有重复的全排列 全排列挑选出任意数字的全排列 //这里写的是无重复的全排列 //比如1-9的全排列 private static int count=0; public static void main(String[] args) { Stack<Integer> stack =new Stack<Integer>(); for(int i=1;i<=9;i++){ stack.push(i); fun(stack); stack.pop(); } System.out.println(count); } private static void fun(Stack<Integer> stack) { if(stack.size()==9){ count++;
return; } for(int j=1;j<=9;j++){ if(!stack.contains(j)){ stack.push(j); fun(stack); stack.pop(); } } } }
关于这个全排列我才用的stack来做
从1-9个数据中随机选取4个数据 结果如下
我们需要注意的是考虑前面对其 那么后面就不一定会对齐
import java.util.ArrayList; //这里我希望比如从1-9中选取4个数出来进行组合 //这里的组合是只考虑组合 不考虑顺序 public class Test1B { //设置一个全局变量用来存储需要存储的数据 private static ArrayList<Integer> arrayList = new ArrayList<Integer>(); private static int count=0; public static void main(String[] args) { //待选数组 int[] A={1,2,3,4,5,6,7,8,9}; //选取数据的个数 int k=4; if(k>A.length||k<=0){ return; } //存储位置 存储数组的下标 待选数据个数 fun(A,0,k); System.out.println(count); } private static void fun(int[] A, int index, int k) { if(k==1){ for(int i=index;i<A.length;i++){ arrayList.add(A[i]); System.out.println(arrayList.toString()+""); count++; arrayList.remove((Object)A[i]); } }else if(k>1){ for(int i=index;i<A.length;i++){ arrayList.add(A[i]); //k值需要减少 因为随着载入数据 必然会带来K值下降 i值增加 fun(A, i+1, k-1); arrayList.remove((Object)A[i]); } }else{ return; } } }
然后是从1-9中选取四个数的全排列
import java.util.ArrayList; //去重复的排列 从1-9中挑选出是四个数进行排列 public class Test1D { private static ArrayList<Integer> arrayList =new ArrayList<Integer>(); private static int count=0; public static void main(String[] args) { int[] A={1,2,3,4,5,6,7,8,9}; int k=4; fun(k,A); System.out.println(count); } private static void fun(int k, int[] A) { if(k==1){ for(int i=0;i<A.length;i++){ arrayList.add(A[i]); System.out.println(arrayList.toString()); arrayList.remove((Object)A[i]); count++; } }else if(k>1){ for(int i=0;i<A.length;i++){ arrayList.add(A[i]); fun(k-1, removElement(A)); arrayList.remove((Object)A[i]); } }else{ return; } } //这个函数的目的 比较数组和Arraylist中那个重叠 如果重叠 就将数组中的数据去掉 private static int[] removElement(int[] A) { ArrayList<Integer> list = new ArrayList<Integer>(); for(int i=0;i<A.length;i++){ //遍历数组 //表示不存在 boolean exit=true; for(int j=0;j<arrayList.size();j++){ //遍历arraylist if(A[i]==arrayList.get(j)){ exit=false; break; } } if(exit){ list.add(A[i]); } } int[] B=new int[list.size()]; for(int m=0;m<list.size();m++){ B[m]=list.get(m); } return B; } }
然后是不去重的从1-9中选取4个数 每个数可以重复四次的排列
import java.util.ArrayList; public class Test1E { private static ArrayList<Integer> arrayList =new ArrayList<Integer>(); private static int count=0; public static void main(String[] args) { int[] A ={1,2,3,4,5,6,7,8,9}; int k=4; fun(0,k,A); System.out.println(count); } private static void fun(int index, int k, int[] A) { if(k==1){ for(int i=0;i<A.length;i++){ arrayList.add(A[i]); System.out.println(arrayList.toString()); arrayList.remove(arrayList.size()-1); count++; } }else if(k>1){ for(int i=0;i<A.length;i++){ arrayList.add(A[i]); fun(i, k-1, A); arrayList.remove(arrayList.size()-1); } }else{ return; } } }
好了 一般的排列问题解决了 希望对你有所帮助
恐惧源于无知,代码改变世界