我的感受這篇文章(原文地址見文章尾)寫的排列組合問題,很是的好,並且是一步一步引出排列組合問題,我也是看了這篇文章,一步一步按照這個思路來,最後會了本身的一套排列組合java
也所以在算法競賽中,兩次用到了,成功解決了問題.算法
第一個問題:數組
首先,先讓咱們來看第一個問題, 有1,2,3,4這4個數字.能夠重複的在裏面選4次,問能獲得多少種結果.easyspa
1 1 1 1.net
1 1 1 2code
1 1 1 3 blog
1 1 1 4get
1 1 2 1class
1 1 2 2import
.......
4 4 4 3
4 4 4 4
代碼實現其實也很簡單,你們能夠看下代碼,理解一下,再本身敲一下,應該能夠很快敲出來
import java.util.Stack; public class Main { public static Stack<Integer> stack = new Stack<Integer>(); public static void main(String[] args) { int shu[] = {1,2,3,4}; f(shu,4,0); } /** * * @param shu 待選擇的數組 * @param targ 要選擇多少個次 * @param cur 當前選擇的是第幾回 */ private static void f(int[] shu, int targ, int cur) { // TODO Auto-generated method stub if(cur == targ) { System.out.println(stack); return; } for(int i=0;i<shu.length;i++) { stack.add(shu[i]); f(shu, targ, cur+1); stack.pop(); } } }
輸出:
[1, 1, 1, 1] [1, 1, 1, 2] [1, 1, 1, 3] [1, 1, 1, 4] [1, 1, 2, 1] [1, 1, 2, 2] ............ ............ [4, 4, 3, 2] [4, 4, 3, 3] [4, 4, 3, 4] [4, 4, 4, 1] [4, 4, 4, 2] [4, 4, 4, 3] [4, 4, 4, 4]
獲得了想要的結果,此處結果又不少種4*4*4*4 = 256種結果。
第二個問題:
同理, 問題來了,這時候有點排列組合的意思了 1,2,3,4排列要的到的是
1 2 3 4 1 2 4 3 1 3 4 2 1 3 2 4 ...... 4 2 1 2 4 3 2 1
有沒有發現要的到排列的狀況,這裏stack裏的元素是1,2,3,4都不能重複
那麼我在入棧的時候加個判斷,若是好比1,已經在stack裏面了,就不加進去,就不會獲得 1 1 1 1 ...的狀況了,就獲得了排列
import java.util.Stack; public class Main { public static Stack<Integer> stack = new Stack<Integer>(); public static void main(String[] args) { int shu[] = {1,2,3,4}; f(shu,4,0); } /** * * @param shu 待選擇的數組 * @param targ 要選擇多少個次 * @param cur 當前選擇的是第幾回 */ private static void f(int[] shu, int targ, int cur) { // TODO Auto-generated method stub if(cur == targ) { System.out.println(stack); return; } for(int i=0;i<shu.length;i++) { if(!stack.contains(shu[i])) { stack.add(shu[i]); f(shu, targ, cur+1); stack.pop(); } } } }
輸出:
[1, 2, 3, 4] [1, 2, 4, 3] [1, 3, 2, 4] [1, 3, 4, 2] [1, 4, 2, 3] [1, 4, 3, 2] [2, 1, 3, 4] [2, 1, 4, 3] [2, 3, 1, 4] [2, 3, 4, 1] [2, 4, 1, 3] [2, 4, 3, 1] [3, 1, 2, 4] [3, 1, 4, 2] [3, 2, 1, 4] [3, 2, 4, 1] [3, 4, 1, 2] [3, 4, 2, 1] [4, 1, 2, 3] [4, 1, 3, 2] [4, 2, 1, 3] [4, 2, 3, 1] [4, 3, 1, 2] [4, 3, 2, 1]
這就是想要的排列結果了.. 4 * 3 * 2 * 1 = 24種結果。
第三個問題:
那麼組合問題來了,在1,2,3,4,中選3個有多少種組合方式
1 2 3 1 2 4 1 3 4 2 3 4 共4種
import java.util.Stack; public class Main { public static Stack<Integer> stack = new Stack<Integer>(); public static void main(String[] args) { int shu[] = {1,2,3,4}; f(shu,3,0,0); // 從這個數組4個數中選擇三個 } /** * * @param shu 元素 * @param targ 要選多少個元素 * @param has 當前有多少個元素 * @param cur 當前選到的下標 * * 1 2 3 //開始下標到2 * 1 2 4 //而後從3開始 */ private static void f(int[] shu, int targ, int has, int cur) { if(has == targ) { System.out.println(stack); return; } for(int i=cur;i<shu.length;i++) { if(!stack.contains(shu[i])) { stack.add(shu[i]); f(shu, targ, has+1, i); stack.pop(); } } } }
輸出:
[1, 2, 3] [1, 2, 4] [1, 3, 4] [2, 3, 4]