1. 程式人生 > 其它 >全排列-回溯演算法的應用

全排列-回溯演算法的應用

技術標籤:面試

從根遍歷這棵樹,記錄路徑上的數字,就是所有的全排列。我們把這棵樹稱為回溯演算法啊的決策樹。
在這裡插入圖片描述
決策樹上每個節點有【路徑】和【選擇】兩個屬性。
路徑:記錄已經做過的選擇;
選擇列表:表示當前可以做出的選擇;
結束條件:也就是到達決策樹底層,就是遍歷到樹的底層,在這裡就是選擇列表為空的時候。

回溯演算法框架:

result= []
def backtrack(選擇列表,路徑):
	if 滿足結束條件:
		result.add(路徑)
		return
		
	for 選擇 in 選擇列表:
		# 做選擇
	    將該選擇從選擇列表移除
	    路徑.add(選擇)
	    backtack(選擇列表, 路徑)
	    # 撤銷選擇
	    路徑.remove(選擇)
	    將該選擇再加入選擇列表
	
class Permute {
    static List<List<Integer>> res = new LinkedList<>();

    /* 主函式,輸入一組不重複的數字,返回它們的全排列 */
    public static List<List<Integer>> permute(int[] nums) {
        // 記錄「路徑」
        LinkedList<Integer> track = new LinkedList<>();
        backtrack(nums,
track); return res; } // 選擇列表:nums 中不存在於 track 的那些元素 // 路徑:記錄在 track 中 // 結束條件:nums 中的元素全都在 track 中出現 public static void backtrack(int[] nums, LinkedList<Integer> track) { // 觸發結束條件 if (track.size() == nums.length) { res.add(new LinkedList(track)
); return; } for (int i = 0; i < nums.length; i++) { // 排除不合法的選擇 if (track.contains(nums[i])) { continue; } // 做選擇 track.add(nums[i]); backtrack(nums, track); // 撤銷選擇 track.removeLast(); } } public static void main(String[] args) { int[] nums = {1, 2, 3}; permute(nums); System.out.println(res); }