常見的算法問題全排列
阿新 • • 發佈:2018-03-27
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; } } }
好了 一般的排列問題解決了 希望對你有所幫助
常見的算法問題全排列