回溯法整理 含leetCode例題

2021-08-04 09:45:12 字數 891 閱讀 9659

把問題分為若干步驟並遞迴求解時,若當前步驟沒有合法選擇,則函式返回上一級遞迴呼叫,這種現象稱為回溯。也成為遞迴列舉方法。

##應用

搜尋可行解(數量)、e.g.八皇后、數獨

最優方案搜尋(剪枝,記錄下當前最優可行解,若在某一步驟的區域性解已經劣於當前最優,則剪枝)

如果在回溯法中使用的輔助的全域性變數,在列舉當前步驟的多個選項時修改了一定要及時把它恢復原狀,若函式有多個出口,在每個出口處恢復。

##衝突約數判斷

注意避免不必要的判斷,因為之前的都已經判斷過,只需判斷當前步驟生成的是否與之前的產生衝突集合,之前步驟之間的衝突無需檢測。

##例題 leetcode 526 beautiful arrangement

輸入乙個正整數n,輸出1~n正數的完美排列個數,此處的完美是指 第k個數a[k]存在這樣的關係,a[k]%k==0或者k%a[k]==0

public

class

solution

public

void

backtracking

(int cur,

boolean

used,

int[

] ans)

used[cand]

=false

;//恢復輔助變數 }}

}}}

public

class

solution

public

void

dfs(

int cur,

int leftk,

int leftn,linkedlist

sofar,list

> ans)

}}

leetcode 回溯法 模板

dfs 模板.param in input 輸入資料指標 param out path 當前路徑,也是中間結果 param out result 存放最終結果 param inout cur or gap 標記當前位置或距離目標的距離 return 路徑長度,如果是求路徑本身,則不需要返回長度 vo...

leetcode回溯法總結

2018.7.30 前文 回溯法和dfs是不一樣的,回溯法有自己很獨特的模板,dfs是一種思想,回溯法是dfs的一種實現。先來看回溯法的典型題型 find a path to success 有沒有解 find all paths to success 求所有解 1.求所有解的個數 2.求所有解的具...

LeetCode 子集(回溯法)

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路分析 對於這種選取元素的題,一般回溯法都能輕鬆決解。首先對子集的長度進行窮舉,每次回溯法只尋找相等長度的...