java實現排列組合(通俗易懂)

 

我的感受這篇文章(原文地址見文章尾)寫的排列組合問題,很是的好,並且是一步一步引出排列組合問題,我也是看了這篇文章,一步一步按照這個思路來,最後會了本身的一套排列組合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]

 

 

 

 

原文地址:  https://blog.csdn.net/Ring_k/article/details/79575533

相關文章
相關標籤/搜索