Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
关于这个题方法很多,我在这里挑了两种常用的:
一、递归实现,每次从现有的串中选择一个,对其他的进行递归全排列,最后和在一起就是最终的结果,这种方法最容易理解,代码如下:
vector<vector<int>> permute(vector<int>& num) {
int n=num.size();
vector<vector<int>> res;
if(n==){
res.push_back(num);
return res;
}
else{
vector<int> copy;
vector<int> temp;
vector<vector<int>> post;
for(int i=;i<n;i++){
copy=num;
copy.erase(copy.begin()+i);
post=permute(copy);
for(int j=;j<post.size();j++){
temp=post[j];
temp.insert(temp.begin(),num[i]);
res.push_back(temp);
}
}
return res;
}
}
二、这种方法其实跟上面的很类似,但是稍快,可能是因为这种方法操作vector的次数少一些,主要思想是:递归进行n次,每次规定前K-1个元素,然后递归下面的n-k个元素,看代码更容易理解点,代码如下:
void perm(vector<vector<int>> &res,vector<int> &nums,int k){
if(k==nums.size()-){
res.push_back(nums);
return;
}else{
perm(res,nums,k+);
for(int i=k+;i<nums.size();i++){
swap(nums[k],nums[i]);
perm(res,nums,k+);
swap(nums[k],nums[i]);
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
perm(res,nums,);
return res;
}
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}