LeetCode 回溯演算法總結

2021-10-02 20:58:17 字數 2106 閱讀 9076

全排列

class

solution

void

f(vectorint>>

&res,vector<

int>

&nums,vector<

int>

&s,vector<

int>

&visited)

for(

int i=

0;isize()

;i++)}

};

子集

class

solution

void

f(vectorint>>

& result, vector<

int> nums,

int startpoint, vector<

int> tmp)}}

;

組合總和

class

solution

voidf(

int start,vectorint>>

&res,vector<

int> s,vector<

int>candidates,

int target)

if(target<0)

for(

int i=start;isize()

;i++)}

};

陣列總和ii

class

solution

voidf(

int start,vectorint>>

&res,vector<

int> s,vector<

int>candidates,

int target)

if(target<0)

for(

int i=start;isize()

;i++)}

};

組合總和

畫樹狀圖就號理解了,兒子節點表示遞迴,兄弟節點表示迴圈。

class

solution

voidf(

int start,vectorint>>

&res,vector<

int>

&s,int k,

int target)

if(target<0)

for(

int i=start+

1;i<=

9;i++)}

};

括號生成

這道題和之前的區別在於,當我們確定之前括號有序時才能繼續新增括號,所以我們可以新增記錄左右括號的個數

class

solution

void

f(vector

&res,string s,

int n,

int left,

int right)

if(left//左括號個數小於n

f(res,s+

'(',n,left+

1,right);if

(left>right)

//右括號個數小於左括號

f(res,s+

')',n,left,right+1)

;}};

字母大小寫全排列

這類題本來是對於每個元素都先考慮放它的情況,再考慮不放它的情況,這道題是,對於每個字母,先考慮放它,再考慮放它的另一種大小寫形式:如果是數字,就直接加進去,然後下一層遞迴;如果是字母,就先加進去,然後下一層遞迴;再加改變大小寫形式, 然後下一層遞迴。

class

solution

void

dfs(string s,

int i)

if(s[i]

>=

'a'&&s[i]

<=

'z')

else

if(s[i]

>=

'a'&&s[i]

<=

'z')

else

dfs(s,i+1)

;}};

回溯 leetcode回溯演算法

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...

leetcode回溯法總結

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

leetcode回溯法總結

回溯演算法套路詳解 學一套走天下 回溯演算法 回溯思想團滅排列 組合 子集問題 回溯法的本質是,多叉樹的深度優先搜尋。result defbacktrack 路徑,選擇列表 if 滿足結束條件 result.add 路徑 return for 選擇 in 選擇列表 做選擇backtrack 路徑,選...