leetcode回溯法總結

2021-09-02 19:57:24 字數 1893 閱讀 9787

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 選擇...