leetcode刷題總結之回溯法

2021-09-30 01:08:31 字數 2144 閱讀 2868

前言:

最近太懶了,好久都沒寫總結了。回溯法是看labuladong的詳解回溯法入的門,然後看了《計算機演算法設計與分析》第5章的回溯法部分弄清了原理,在leetcode上做了差不多20個題,今日總結一下,供以後複習用。

回溯法的定義:

回溯法有通用解法的美稱,對於很多問題,如迷宮等都有很好的效果。回溯法實際就是對問題的解空間樹採用深度優先搜尋的方式,搜尋需要解決問題的任一解或者所有解,它是乙個既帶系統性又帶跳躍性的搜尋演算法。

回溯法的解空間樹:

所有可行解構成的多叉樹成為解空間樹,解空間樹中從根節點到葉子節點的一條路徑為回溯法的任一解。對於n=3時,0/1揹包表示的解空間樹,如下:

回溯法的解題步驟:

注:剪枝函式分為約束函式和限界函式。約束函式表示在解空間樹的擴充套件節點處剪去不滿足約束的子樹,限界函式表示減去得不到最優解的子樹。

回溯法的框架:

//choicelist:表示可以進行選擇的列表,相當於樹中可選用左節點還是右節點

//track:表示為決策路徑,相當於在解空間樹中為根節點到某個葉子節點的路徑

//result:表示存放根節點到所有葉子節點的所有路徑,所有可行解

backtrack

(choicelist,track,result)

}

回溯法的時間複雜度:習題解析:10.正規表示式匹配:回溯框架變形,細節問題比較難想,具體可看題解。

17.**號碼的字母組合:回溯法的標準框架,沒啥變化,具體可看題解。

22.括號生成:本題使用n來表示左括號可以使用個數,用index來表示右括號可以使用的次數。在每使用掉乙個左括號時,對應可以使用右括號的數量+1,因為這樣可以保證左右括號是對等的(也就是先有左括號,然後再有右括號,這樣就避免無效括號了)。

37.解數獨:回溯框架+剪枝,其他細節問題較多,具體可看題解。

39.組合總和:回溯的標準框架,細節問題可看題解。

40.組合總數 ⅱ:在39.組合總和的基礎上加上剪枝即可。

44.萬用字元匹配:回溯框架變形,細節問題可看題解。

46.全排列:回溯的標準框架,細節問題可看題解。

47.全排列 ⅱ:在46.全排列的基礎上加上剪枝,針對同一層次的計算,對連續的相同的元素只選取乙個進行後續的替換,即可等價於基礎全排列。

51.n皇后:回溯框架+剪枝(判斷皇后是否為可行皇后),細節問題可看題解。

52.n皇后 ⅱ:本題在51.n皇后基礎上直接返回所有可行皇后的個數。

60.第k個排列:本題使用回溯超時了,遂使用數學方法康托展開法來解題。

77.組合:本題與全排列的區別在於全排列中會出現[1,2]、[2,1]這樣的排列,然而在組合中是不能存在的,所以我們每次需要將組合數第乙個數固定,然後組合數之後的數依次增大。

78.子集:與77.組合的演算法思想一樣,發現共性便可求解。

79.單詞搜尋:本題又是一道回溯法經典練習題,212.單詞搜尋 ⅱ是使用字首樹+回溯法解決的,而本題難度相對而言小一點,直接使用回溯法就好了。

89.格雷編碼:這裡用暴力法比回溯法簡單一點,不過兩份**都提供了,具體可看題解。

93.復原ip位址:回溯法,ip位址有三個點,分為四段,每段的數字範圍必須在[0,255]內,注意0只能作為單獨乙個段,比如:0.0.0.124,細節問題具體可看題解。

131.分割回文串:思想與n皇后的回溯法差不多的模板,尋找到所有的可行解後,回溯完成!

282.給表示式新增運算子:本題最難最難的就是處理乘法了,由於乘法的優先順序比加、減法高,所以在遇到乘號時需要回退到上一步,然後將上一步的運算元與乘法進行運算。

leetcode刷題總結之遞迴

前言 最近刷完leetcode遞迴的專題了,無奈本人很菜,關於遞迴每次都是看大佬的題解,自己也設計不出來遞迴,今日打算從遞迴本質出發,徹底剖析遞迴。本文中的大部分遞迴思想來自 遞迴的內涵與經典應用。在數學與電腦科學中,遞迴 recursion 是指在函式的定義中使用函式自身的方法。實際上,遞迴,顧名...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...