思路:
全排列问题是一个很经典的回溯法的问题,可以和N皇后问题放在一起进行对比学习
其本质还是对于解空间树的理解,只需要完整的对解空间树进行一次深度优先遍历,就可以得出结果,这道题的解空间树如图所示:
具体到代码上,这类题目有固定的套路:
1.凡是需要进行修改的数据,尽量以引用的形式写在dfs的形式参数列表当中;
2.在写递归主体之前,首先将递归出口写好,首先因为递归出口很重要,其次是因为它好写,例如此题,递归出口十分简单,就是看当前向量temp的大小是否与nums向量相同
3.递归之前作出抉择,递归之后回溯,撤销抉择
代码:
class Solution {
public:
vector<int> temp;
vector<vector<int>> ans;
void dfs(vector<int>& nums,vector<int>& temp,vector<vector<int>>& ans,vector<bool>& isSelected){
if(temp.size()==nums.size()){
ans.push_back(temp);
return;
}
int len = nums.size();
for(int i=0;i<len;i++){
if(!isSelected[i]){
//递归之前,做出选择
temp.push_back(nums[i]);
isSelected[i]=true;
dfs(nums,temp,ans,isSelected);
//递归之后,撤销选择
temp.pop_back();
isSelected[i]=false;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> isSelected(nums.size(),false);
dfs(nums,temp,ans,isSelected);
return ans;
}
};