”回溯演算法“框架及練習題

刘大猫26發表於2024-11-01

@

目錄
  • 一、回溯演算法是什麼?
  • 二、框架如下:
  • 本人其他文章連結

一、回溯演算法是什麼?

結論:回溯 = 窮舉
解決一個回溯問題,實際上就是一個決策樹的遍歷過程

  1. 路徑:就是已經做出的選擇
  2. 選擇列表:就是你當前可以做出的選擇
  3. 結束條件:就是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 二叉樹面試題

相關文章