回溯法问题:实际上就是一个决策树的遍历过程
分为三步:
- 路径:已做出选择的路径。
- 选择列表:当前可以做的选择
- 结束条件:就是到达决策树的底层,无法再做出选择的条件。(退出条件 )
template<class T>
vector<T> res;
//回溯法的代码框架
dfs btrack(路径,选择列表)
{
if(满足结束的条件)
{
res.push_back(路径);
return ;
}
for(选择 : 选择列表)
{
在选择列表中:做出选择;
btrack(路径,选择列表); // 递归
撤销选择;
}
}
核心:for循环中的在递归之前做出的选择,与撤销选择
全排列问题:
LeetCode:全排列问题
void permuteCount(vector<vector<int>>& res,vector<int>& nums,int state)
{
if(state == nums.size()) //退出条件
{
res.push_back(nums);
}
for (int j = state; j<nums.size(); j++){
swap(nums[state], nums[j]); //列表选择
permuteCount(res,nums,state+1);
swap(nums[state], nums[j]); //撤销选择
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
permuteCount(res,nums,0);
return res;
}