直观上看这道题就是一道dfs问题,所以我们按照dfs的套路直接写就行。这个题和47题Permutations2很相似,但是这道题相对的难度要第一写,因为这个给定的序列里面没有重复。我们在递归调用的时候设置一个visit数组记录一下当前位置是不是被访问就可以了。然后每一个递归调用都是从序列位置开始。
代码入下:
vector<vector<int>> permute(vector<int>& num) {
vector<vector<int>>res;
vector<int>visited(num.size(), 0);
dfs(res,num,visited,0,{});
return res;
}
void dfs(vector<vector<int>>&res,vector<int> num,vector<int>&visited,int level,vector<int>out){
###递归返回条件。
if(level==num.size()){
res.push_back(out);
return ;}
for(int i=0;i<num.size();i++){##注意这个地方是每次都是从零开始,因为是全排列。
if(visited[i]==0){
visited[i]=1;##剪枝操作,
out.push_back(num[i]);
dfs(res,num,visited,level+1,out);
out.pop_back();##回溯
visited[i]=0;
}
}
}