回溯演算法初步

2021-10-11 10:25:17 字數 3204 閱讀 7053

第二週刷題總結

#leetcode

#回溯演算法

本週主要是做了leetcode關於回溯演算法的相關題目,總結了一些演算法型別與答題模板。

1.答題模板

(1)畫出遞迴樹,找到狀態變數,進而推出回溯函式的引數

(2)根據題意,確立結束條件

(3)進行選擇

(4)進入遞迴函式,注意傳入的起始引數

(5)回溯

2.遞迴樹(以子集問題為例)

3.回溯演算法的題目型別及其特點

型別特點

子集問題

無順序、結果在遞迴樹結點上收集

組合問題

無順序、結果在遞迴樹葉子節點上面收集

排列問題

有順序、結果在遞迴樹子節點上面收集

當然,除了上面三種基礎的回溯問題外,還有切割、棋盤搜尋等問題,在此暫不討論。

4.例題

①子集給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集),解集不能包含重複的子集。

示例:輸入: nums = [1,2,3]

輸出:[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

class

solution

void

backtracking

(vector<

int>

&nums,vector

int>>

&result,vector<

int>

&path,

int firstindex)}}

;

②子集ⅱ

相對於上一題子集,此題給定的是乙個可能包含重複元素的整數陣列 nums

class

solution

path.

push_back

(nums[i]);

used[i]

=true

;backtracking

(nums,used,i+1)

; used[i]

=false

; path.

pop_back()

;}} vector

int>>

subsetswithdup

(vector<

int>

& nums)

};

③組合

給定兩個整數 n 和 k,返回 1 … n 中所有可能的 k 個數的組合。

示例:輸入: n = 4, k = 2

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

class

solution

void

backtracking

(int n,

int k,

int startindex)

for(

int i = startindex;i<=n;i++)}

};

④組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

示例 1:

輸入:candidates = [2,3,6,7], target = 7,

所求解集為:

[[7],

[2,2,3]

]

class

solution

for(

int i=start;i

size()

&& sum+candidates[i]

<=target;i++)}

vector

int>>

combinationsum

(vector<

int>

& candidates,

int target)

};

⑤組合總和ⅱ

與上一題不同的是,candidates 中的每個數字在每個組合中只能使用一次。

class

solution

for(

int i=start;i

size()

&& sum+candidates[i]

<=target;i++)}

vector

int>>

combinationsum2

(vector<

int>

& candidates,

int target)

};

⑥全排列

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。

示例:輸入: [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

class

solution

for(

int i=

0;isize()

;i++)}

vector

int>>

permute

(vector<

int>

& nums)

};

⑦全排列ⅱ

與上一題不同,nums是乙個可包含重複數字的序列。

class

solution

for(

int i=

0;isize()

;i++)}

} vector

int>>

permuteunique

(vector<

int>

& nums)

};

回溯 leetcode回溯演算法

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

演算法 回溯演算法

回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試 1 有許多問題,當需要找出它的解集或者要求回答什麼解是滿足某些約束條件的最佳解時,往往要使用回溯法 2 回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必...

經典演算法 回溯演算法

回溯是遍歷搜尋空間所有可能組態的方法。這些組態也許代表物件的所有排列或這是構建物件集合的所有可能的方法 子集 其他情況包括列舉乙個圖的所有生成樹,兩個節點的所有路徑或是把節點分類成不同顏色的所有不同的方式。這些問題有乙個共同的難點就是我們必須每次產生乙個可能的組態。避免重複或遺漏組態的方法就是我們必...