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].
给定集合是{a,b,c},所有排列组成:
1.以a开头后面跟着(b,c)的排列
2.以b开头后面跟着(a,c)的排列
3.以c开头后面跟着(a,b)的排列
这是一种递归,数组中只有一个元素的时候,无需再排列,即递归出口。
因为依次对数组的1-2,1-3,...位进行交换,所以每次交换排列后,需要再次交换使数组归位。
void perm(vector<vector<int> >& ret, vector<int>& num, int cur)
{
if(num.size() == cur)
{
ret.push_back(num);
}
else
{
for(int i = cur; i < num.size(); i++)
{
swap(num[cur], num[i]);
perm(ret, num, cur+1);
swap(num[cur], num[i]);
}
}
}
vector<vector<int> > permute(vector<int> &num)
{
vector<vector<int> > ret;
perm(ret, num, 0);
return ret;
}
=======================================================================
另外一种DFS比较经典:
vector<bool> used;
vector<int> current;
void Permute(vector<int> &num, int depth, vector<vector<int> > &res)
{
if(depth==num.size())
{
res.push_back(current);
//return; dosen't matter
}
else
for(int i=0; i<used.size(); i++)
{
if(used[i]==false)
{
current.push_back(num[i]);
used[i]=true;
Permute(num,depth+1,res);
used[i]=false;
current.pop_back();
}
}
}
vector<vector<int> > permute(vector<int> &num)
{
for(int i=0; i<num.size(); i++)
used.push_back(false);
vector<vector<int> > res;
Permute(num,0,res);
return res;
}