全排列-回溯演算法的應用
阿新 • • 發佈:2020-12-25
技術標籤:面試
從根遍歷這棵樹,記錄路徑上的數字,就是所有的全排列。我們把這棵樹稱為回溯演算法啊的決策樹。
決策樹上每個節點有【路徑】和【選擇】兩個屬性。
路徑:記錄已經做過的選擇;
選擇列表:表示當前可以做出的選擇;
結束條件:也就是到達決策樹底層,就是遍歷到樹的底層,在這裡就是選擇列表為空的時候。
回溯演算法框架:
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);
}