zoukankan      html  css  js  c++  java
  • 常见的算法问题全排列

    在我参加蓝桥杯时发现 大多数问题都可以采用暴力破解 所以这个时候我就想进行一下总结:

    关于全排列问题的通用解法,比如:(无重复全排列)(有重复的选取) (从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;
            }
        }
    
    }

    好了 一般的排列问题解决了 希望对你有所帮助

    恐惧源于无知,代码改变世界
  • 相关阅读:
    原来生成函数这么简单
    p1919 A*B Problem升级版
    线性基初步
    高斯消元详解
    FFT模板
    BSGS(大小步)算法
    p1516&poj1061&bzoj1477 青蛙的约会
    p1082 同余方程
    qboimathtest1 t1 魔法串
    qboimathtest1 t2 配对
  • 原文地址:https://www.cnblogs.com/ad-zhou/p/8652164.html
Copyright © 2011-2022 走看看