常见的算法问题全排列

Posted coder-zhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的算法问题全排列相关的知识,希望对你有一定的参考价值。

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

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

}

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

以上是关于常见的算法问题全排列的主要内容,如果未能解决你的问题,请参考以下文章

全排列算法的全面解析

全排列算法的全面解析

一文通数据结构与算法之——回溯算法+常见题型与解题策略+Leetcode经典题

C语言数字全排列的问题(急!!)求C代码和算法

算法设计:全排列算法代码实现

算法——全排列