来自labuladong的思想(leetcode)
解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。
如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象。
代码方面,回溯算法的框架
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择
其核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public: vector<vector<int>> res; //路径 void swap(int &a, int &b) { int temp; temp=a; a=b; b=temp; } void backtrack(vector<vector<int>> &res,vector<int> &nums, int n) //回溯函数 ,路径,选择列表 { if(n==nums.size()) //结束条件 { res.push_back(nums); //形成一个全排列,就放入res中 } for(int i=n;i<nums.size();i++) { swap(nums[i],nums[n]); //递归之前做选择 backtrack(res,nums,n+1); swap(nums[i],nums[n]); //递归之后撤掉选择 } } vector<vector<int>> permute(vector<int>& nums) { backtrack(res,nums,0); return res; } };
知识点相关链接:https://blog.csdn.net/rookie_Hyg/article/details/103998956