回溯算法模板
void backtracking(參數(shù)) {
? ? if (終止條件) {
? ? ? ? 存放結(jié)果;
? ? ? ? return;
? ? }
? ? for (選擇:本層集合中元素(樹中節(jié)點孩子的數(shù)量就是集合的大?。? {
? ? ? ? 處理節(jié)點;
? ? ? ? backtracking(路徑,選擇列表); // 遞歸
? ? ? ? 回溯,撤銷處理結(jié)果
? ? }
}
回溯和遞歸是相輔相成的
77.?組合??
遞歸函數(shù)的返回值以及參數(shù):
在這里要定義兩個全局變量,一個用來存放符合條件單一結(jié)果,一個用來存放符合條件結(jié)果的集合
參數(shù):n和k、startIndex防止出現(xiàn)重復(fù)的組合
回溯函數(shù)終止條件:
終止條件代碼:
if(path.size()==k){result.push_back(path);return;}
單層搜索的過程
回溯法的搜索過程就是一個樹型結(jié)構(gòu)的遍歷過程,在如下圖中,可以看出for循環(huán)用來橫向遍歷,遞歸的過程是縱向遍歷
publicvoidbacktracking(intn,intk,intstartIndex){if(path.size()==k){result.add(newArrayList<>(path));return;}for(inti=startIndex;i<=n;i++){path.add(i);backtracking(n,k,i+1);path.removeLast();}}