2018.7.30
前文:回溯法和dfs是不一樣的,回溯法有自己很獨特的模板,dfs是一種思想,回溯法是dfs的一種實現。
先來看回溯法的典型題型:
find a path to success 有沒有解對應的三種模板:find all paths to success 求所有解
1.求所有解的個數 2. 求所有解的具體資訊
find the best path to success 求最優解
第一種,返回值是true/false。一般情況下,第二種居多,第二種也是最難理解了,得到了所有可行的解,自然可以得出這些解中的最優解。第二種,求個數,設全域性counter,返回值是void;求所有解資訊,設result,返回值void。
第三種,設個全域性變數best,返回值是void。
下面給出第二種的常見題型和解答:
總結上述的這些題型就有乙個特點,找出滿足給定條件的集合,實際就是滿足條件的結果樹,進行回溯法遍歷即可。
如果題目說,給定乙個集合,然後給某種條件,去找到滿足條件的所有結果,這一類都可以用回溯法來完成。
這一類的經典模板如下:
ans用來儲存中間結果,這裡需要說明的是ans是拷貝賦值,也就是說葉子節點的深搜不影響到父節點,所以父節點只需要將當前節點插入的資料彈出即可,那麼遍歷下乙個情況的時候,ans就是空的了,相當於當前節點彈出,進行到下乙個節點了。
注意點:
start,遍歷的起始位置
ans,中間結果的儲存
pop_back,回溯到上一層
那麼這種回溯的模板和dfs有什麼區別呢?
dfs可以簡單理解為中序遍歷,其實是一種遍歷的方法,它保留了所有的節點資訊,例如遍歷到葉子節點,然後遞迴回來,繼續遍歷右子數,再去遞迴到葉子節點,每個節點的資料都儲存了一遍。
而對於回溯,和dfs不同的是,它往往使用的是迴圈,迴圈遍歷結果的初始可能性。
兩者區別也不是那麼大,只是某一類情況,用回溯更加清楚直接。
leetcode回溯法總結
回溯演算法套路詳解 學一套走天下 回溯演算法 回溯思想團滅排列 組合 子集問題 回溯法的本質是,多叉樹的深度優先搜尋。result defbacktrack 路徑,選擇列表 if 滿足結束條件 result.add 路徑 return for 選擇 in 選擇列表 做選擇backtrack 路徑,選...
回溯法總結
1 回溯法解決老鼠迷宮問題 求一條路徑 static int maze static int starti 1,startj 1 入口s static int endi 7,endj 7 出口 static boolean falg false public static void visit in...
回溯法總結
一般回溯法可以用兩種框架,一種遍歷方式 for迴圈 選擇方式 可以理解成到某一節點選擇或者不選 比較二者的差別 1.採用遍歷方式,for int i dep i選擇的方式記得判斷dep是否到達邊界dep nums.size 同時記得dep 2.遍歷方式中for迴圈的臨時變數儲存的是temp i 選擇...