解决一个回溯问题,实际上就是一个决策树的遍历过程
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。
一、全排列问题
for 选择 in 选择列表:
# 做选择
将该选择从选择列表移除
路径.add(选择)
backtrack(路径, 选择列表)
# 撤销选择
路径.remove(选择)
将该选择再加入选择列表
class Solution {
public:
vector<vector<int>>res;
vector<vector<int>> permute(vector<int>& nums) {
vector<int>tmp;
backtrace(tmp, nums);
return res;
}
void backtrace(vector<int>tmp, vector<int>nums){
if(tmp.size()==nums.size()){
res.push_back(tmp);
}
for(int i=0;i<nums.size();i++){
if(find(tmp.begin(),tmp.end(),nums[i])==tmp.end()){
tmp.push_back(nums[i]);
backtrace(tmp, nums);
tmp.pop_back();
}
}
}
};