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;
}