回溯演算法或DFS中謹慎使用自增自減運算子去操作引數
阿新 • • 發佈:2021-11-04
回溯演算法或DFS中需要反覆回到樹的不同層,用於控制層的引數謹慎使用自增++和自減--運算子。
這裡直接貼一個leetcode第77題組合的回溯解法。https://leetcode-cn.com/problems/combinations/
1 class Solution { 2 vector<int> pathVec; 3 vector<vector<int>> resultVec; 4 public: 5 vector<vector<int>> combine(int n, int k) {6 _backtrack(n,k,1); 7 return resultVec; 8 } 9 10 void _backtrack(int n,int k,int index) 11 { 12 if(k==0) 13 { 14 resultVec.push_back(pathVec); 15 } 16 else 17 { 18 for(int i=index;i<=n;++i) 19 {20 pathVec.push_back(i); 21 _backtrack(n,k-1,i+1); 22 pathVec.pop_back(); 23 } 24 } 25 return; 26 } 27 };
回溯函式_backtrack函式的第二個引數k代表第k個組合數,即多叉樹的層數。當第21行k-1改成--k時,會造成樹的層次混亂,當程式執行到第k層時,呼叫的下一層回溯函式如下:
假設i=1->3 //使用--k或者k--_backtrack(n,k-1,2); _backtrack(n,k-2,3); //直接跳躍到第k-2層 _backtrack(n,k-3,4); //直接跳躍到第k-3層 //正確使用k-1時 _backtrack(n,k-1,2); _backtrack(n,k-1,3); _backtrack(n,k-1,4);