给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
回溯法求全排列有两种手段,要么是交换数组元素,要么使用一个标记数组,先看我爱的交换数组元素,上代码~
class Solution {
public:
vector<vector<int>> res;
void swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
void dfs(vector<int>& nums,int len,int i){
if(i==len-1){
res.push_back(nums);
return ;
}
for(int j=i;j<len;j++){
swap(nums[i],nums[j]);
dfs(nums,len,i+1);
swap(nums[i],nums[j]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
dfs(nums,nums.size(),0);
return res;
}
};
看看运行结果,8错8错
再试试标记法
上代码
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
int flag[6];
void swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
void dfs(vector<int>& nums,int i,int len){
if(i==len){
res.push_back(path);
return ;
}
for(int j=0;j<len;j++){
if(flag[j])
continue;
flag[j]=1;
path.push_back(nums[j]);
dfs(nums,i+1,len);
flag[j]=0;
path.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
int len=nums.size();
if(!len){
return res;
}
dfs(nums,0,len);
return res;
}
};
看结果
果然不如交换法,我还改了好一会儿~