解决一个回溯问题,实际就是一个决策树的遍历过程。只需要思考3个问题:
1)路径:也就是已经做出的选择
2)选择列表:也就是你当前可以做的选择
3)结束条件:也就是到达决策树底层,无法再做选择的条件
回溯算法的通用框架如下:
result = []
def backtrack(路径,选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表);
撤销选择
其核心就是for循环里面的递归,在递归前做选择,递归后撤销选择。下面结合全排列的问题(LeetCode 46)来理解该框架:
class Solution {
public:
vector<vector<int>> vec;
vector<vector<int>> permute(vector<int>& nums) {
vector<int> road;
backtrack(nums, road);
return vec;
}
void backtrack(vector<int>& nums, vector<int>& road){
//结束条件
if(road.size() == nums.size()){
vec.push_back(road);
return;
}
for(int data:nums){
if(find(road.begin(), road.end(), data) != road.end()){
continue;
}
//做选择
road.push_back(data);
backtrack(nums, road);
//撤销选择
road.pop_back();
}
}
};