1. 程式人生 > >常見的算法問題全排列

常見的算法問題全排列

contain string 全排列 遍歷數組 fun get 位置 size body

在我參加藍橋杯時發現 大多數問題都可以采用暴力破解 所以這個時候我就想進行一下總結:

關於全排列問題的通用解法,比如:(無重復全排列)(有重復的選取) (從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;
        }
    }

}

好了 一般的排列問題解決了 希望對你有所幫助

常見的算法問題全排列