@
目錄
- 一、回溯演算法是什麼?
- 二、框架如下:
- 本人其他文章連結
一、回溯演算法是什麼?
結論:回溯 = 窮舉
解決一個回溯問題,實際上就是一個決策樹的遍歷過程
- 路徑:就是已經做出的選擇
- 選擇列表:就是你當前可以做出的選擇
- 結束條件:就是base case條件,也就是臨界條件
二、框架如下:
框架如下:
result = []
def backtrack(路徑,選擇列表) {
if 滿足結束條件 :
result.add(路徑)
return
for 選擇 in 選擇列表
做選擇
backtrack(路徑,選擇列表)
撤銷選擇
}
舉例:經典回溯演算法問題:全排列問題
public class TestNode {
private static List<List<Integer>> res = new LinkedList<>();
public static void main(String[] args){
//問題2.1:全排列問題
permute(new int[]{1,2,3});
res.stream().forEach(item -> System.out.print(item + " "));
}
/**
* 問題2.1:全排列問題,輸入一個陣列,輸出所有全排列順序
* 框架:路徑:記錄在track中
* 選擇列表:nums中不存在於track的那些元素
* 結束條件:nums中元素全部在track中出現
* @param nums 陣列
* @return list
*/
public static List<List<Integer>> permute(int[] nums) {
//記錄“路徑”
LinkedList<Integer> track = new LinkedList<>();
backtrack(nums, track);
return res;
}
public static void backtrack(int[] nums, LinkedList<Integer> track) {
//base case
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();
}
}
輸出結果
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]
本人其他文章連結
1.單連結串列題+陣列題(快慢指標和左右指標)
2.BFS(Breath First Search 廣度優先搜尋)
3.”回溯演算法“框架及練習題
4.JAVA 二叉樹面試題