java如何進行排列組合運算
阿新 • • 發佈:2020-10-22
第一個問題:
首先,先讓我們來看第一個問題, 有1,2,3,4這4個數字.可以重複的在裡面選4次,問能得到多少種結果.easy
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 4 3
4 4 4 4
程式碼實現其實也很簡單,大家可以看下程式碼,理解一下,再自己敲一下,應該可以很快敲出來
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[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 5 6 7 |
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 ...的情況了,就得到了排列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ 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 4 5 6 |
1 2 3
1 2 4
1 3 4
2 3 4
共 4 種
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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 4 |
[ 1 , 2 , 3 ]
[ 1 , 2 , 4 ]
[ 1 , 3 , 4 ]
[ 2 , 3 , 4 ]
|