问题描述:
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].
给一个内部元素互不相等的集合,求它的全排列。
解题思路:
利用栈的方法模拟数字的空位插入,如果集合元素有重复的,我这写的肯定TLE,太渣太渣,还好勉强AC了,
这里应该必须用DFS啊,请自己搜索!
class Solution
{
public:
vector<vector<int> > permute(vector<int> &num)
{
vector<vector<int> > Permute;
if(num.size() <= 1)
{
Permute.push_back(num);
return Permute;
}
vector<int> elemOfPermute;
elemOfPermute.push_back(num[0]);
elemOfPermute.push_back(num[1]);
Permute.push_back(elemOfPermute);
elemOfPermute.clear();
elemOfPermute.push_back(num[1]);
elemOfPermute.push_back(num[0]);
Permute.push_back(elemOfPermute);
if(num.size() == 2)
{
return Permute;
}
for(size_t i=2; i<num.size(); i++)
{
vector<vector<int> > tempPermute;
for(size_t j=0; j<Permute.size(); j++)
{
vector<vector<int> > temp;
temp = insertElem(i ,Permute[j], num[i]);
for(size_t k=0; k<temp.size(); k++)
{
tempPermute.push_back(temp[k]);
}
}
Permute.clear();
Permute = tempPermute;
tempPermute.clear();
}
return Permute;
}
vector<vector<int> > insertElem(unsigned int initSize, vector<int> arrayOfNum, int numIsInserted)
{
stack<int> stk;
vector<vector<int> > Permute;
for(size_t i=0; i<initSize; i++)
{
stk.push(arrayOfNum[i]);
}
for(size_t i=0; i<arrayOfNum.size()+1; i++)
{
vector<int> elemOfPermute;
stack<int> tempStack = stk;
for(size_t j=0; j<i; j++)
{
elemOfPermute.push_back(tempStack.top());
tempStack.pop();
}
tempStack.push(numIsInserted);
while(!tempStack.empty())
{
elemOfPermute.push_back(tempStack.top());
tempStack.pop();
}
Permute.push_back(elemOfPermute);
}
return Permute;
}
};