2021 2 24 刷題(回溯 組合問題)

2022-06-11 12:18:10 字數 1181 閱讀 8099

題目描述:

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

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

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]回溯實質是回溯三部曲:

回溯函式的引數及返回值

回溯函式的終止條件

回溯搜尋的遍歷過程

回溯函式的模板:

void backtracking(引數) 

for (選擇:本層集合中元素(樹中節點孩子的數量就是集合的大小))

}

解題:

class solution 

for(int i = startindex; i <= n; i++)

}vector> combine(int n, int k)

};

剪枝優化:

例如n = 4,k = 4 ,那麼第一層for迴圈的時候,從元素2開始的遍歷都沒有意義了。在第二層for迴圈,從元素3開始的遍歷都沒有意義了。

所以,可以剪枝的地方就在遞迴中每一層的for迴圈所選擇的起始位置。如果for迴圈選擇的起始位置之後的元素個數 已經不足 我們需要的元素個數了,那麼就沒有必要搜尋了。

優化過程如下:

已經選擇的元素個數:path.size();

還需要的元素個數為: k - path.size();

在集合n中至多要從該起始位置 : n - (k - path.size()) + 1,開始遍歷。

class solution 

for (int i = startindex; i <= n - (k - path.size()) + 1; i++)

}public:

vector> combine(int n, int k)

};

刷題之回溯法 累加數問題

累加數是乙個字串,組成它的數字可以形成累加序列。乙個有效的累加序列必須至少包含 3 個數。除了最開始的兩個數以外,字串中的其他數都等於它之前兩個數相加的和。給定乙個只包含數字 0 9 的字串,編寫乙個演算法來判斷給定輸入是否是累加數。說明 累加序列裡的數不會以 0 開頭,所以不會出現 1,2,03 ...

回溯演算法 組合問題

回溯搜尋法 純暴力搜尋,不是一種高效的演算法。但因為有些問題能夠通過回溯法解決已經很棒了,回溯法比那種通過多層迴圈的效率還是要高很多的。回溯法均可抽象為乙個n叉樹形結構,這個樹的寬度是這個集合所有的元素,深度為遞迴的深度。如下圖 回溯三步曲 1.遞迴函式引數和返回值 2.確定終止條件 3.單層遞迴邏...

刷題 子集和問題的回溯剪枝解法

輸入給定整數集,問是否存在該整數集的子集,使得該子集元素的和為0。比如給定的整數集合為 7,3 2,5,8 存在集合的子集 3,2,5 該子集和為0。input 2 3 4 5 0output 1101 0000這裡不給出 如果有興趣可以去看一下 程老師 的書。傳統解法的思路是 直接窮舉出所有子集合...