【题目描述】
Given a collection of 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]
.
Subscribe to see which companies asked this question
【思路】
dfs:
void dfs(int step){
①判断边界;
②尝试每一种可能
for (i = 1; i <= n; i++){
③继续下一步 dfs(step+1)
}
④返回;
}
1.偷懒直接用的stl里的next_permutation
2用的迭代
3,其实和2思路一样,不过用的递归。
- 生成[2, 3]的全排列[2, 3]和[3, 2],然后把1加上去生成[1, 2, 3]和[1, 3, 2]。
- 交换1和2的位置,生成[1, 3]的全排列[1, 3]和[3, 1],然后把2加上去生成[2, 1, 3]和[2, 3, 1]。
- 在第二步的基础上交换2和3的位置,生成[2, 1]的全排列[2, 1]和[1, 2],然后把3加上去生成[3, 2, 1]和[3, 1, 2]。
4.最后一个是从discuss里看到的解法,相当于实现了next_permutation
【代码】
1.
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
do{
ans.push_back(nums);
}while(next_permutation(nums.begin(),nums.end()));
return ans;
}
};
2.
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ans;
vector<vector<int>> tmp;
vector<int> path;
vector<int> cur;
int n=nums.size();
if(n==1||n==0){
ans.push_back(nums);
return ans;
}
for(int i=0;i<n;i++){
cur=nums;
cur.erase(cur.begin()+i);
tmp=permute(cur);
for(int j=0;j<tmp.size();j++){
path=tmp[j];
path.insert(path.begin(),nums[i]);
ans.push_back(path);
}
}
//dfs(nums,0,0,ans,path);
return ans;
}
};
3.
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> path;
dfs(nums,0,ans,path);
return ans;
}
void dfs(vector<int>& nums,int start,vector<vector<int>>& ans,vector<int>& path){
if(start==nums.size()) ans.push_back(path);
else {
for(int i=start;i<nums.size();i++){
swap(nums[i],nums[start]);
path.push_back(nums[start]);
dfs(nums,start+1,ans,path);
path.pop_back();
swap(nums[i],nums[start]);
}
}
}
};
4.
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
const int size=nums.size();
bool used[size]={false};
vector<int> tmp;
generate(result,used,nums,tmp);
return result;
}
void generate(vector<vector<int>> &result,bool used[],vector<int> &nums,vector<int> &tmp){
int count=0;
for(int i=0;i<nums.size();++i){
if(!used[i]){
used[i]=true;
tmp.push_back(nums[i]);
generate(result,used,nums,tmp);
used[i]=false;
tmp.pop_back();
++count;
}
}
if(count==0)
result.push_back(tmp);
}