題目描述:
給定兩個整數 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這裡不給出 如果有興趣可以去看一下 程老師 的書。傳統解法的思路是 直接窮舉出所有子集合...