計算集合裏全排列

方法一 多少個數就搞多少個循環 依次遍歷

public static void main(String[] args) {
		List list = new ArrayList();
		list.add(1);
		list.add(2);
		list.add(3);
		for (int i = 0; i < list.size(); i++) {
			for (int j = 0; j < list.size(); j++) {
				for (int k = 0; k < list.size(); k++) {
					if(i!=j&&i!=k&&j!=k){
						System.out.println(list.get(i)+"-"+list.get(j)+"-"+list.get(k));
					}

				}
			}
		}
	}

方法二 使用回溯的方法,把所有的結果轉換爲一棵樹

class Solution {
    	
    public  List<List<Integer>> permute(int[] arr) {
		List<List<Integer>> res = new ArrayList<>();
		if(arr==null||arr.length==0){
			return res;
		}
		int len = arr.length;
		//定義狀態變量
		boolean[] used = new boolean[len]; //狀態變量 標識對應數組的元素在遞歸遍歷的時候是否使用  默認都是false
		List<Integer> path = new ArrayList<>();//路徑 dfs的一條路徑,
		dfs(arr,len,0,used,path,res);
		return res;
	}



	  public   void dfs(int[] arr, int len, int depth, boolean[] used, List<Integer> path, List<List<Integer>> res) {
		//判斷是否到底部
		if(depth == len){
			res.add(new ArrayList(path));
			return;
		}
		//每個數字開頭都要遍歷
		for (int i= 0;i<len ;i++ ) {
			if(!used[i]){
				path.add(arr[i]);
				used[i] = true;
				dfs(arr,len,depth+1,used,path,res);
				//遞歸到底層之後要進行狀態重置,重置是否使用,重置路徑
				path.remove(path.size()-1);
				used[i] = false;
			}
		}
	}
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章