题目描述:
给定一个数字列表,返回其所有可能的排列。
例如:
给出一个列表[1,2,3],其全排列为:
[
[1, 2, 3],
[1, 3, 2],
[2, 1, 3],
[2, 3, 1],
[3, 1, 2],
[3, 2, 1]
]
思路1:
从集合中依次选出每一个元素作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归从而得到全排列。例如:
固定1,求后面2,3的排列123,132,求完后交换1和2得到213,
固定2,求后面1,3的排列213,231,求完后3放到第一个位置321,
固定3,求后面1,2的排列321,312
代码:
class Solution
{
public:
vector<vector<int>> permute(vector<int> &num)
{
vector<vector<int>> res;
if(num.size() == 0)
return res;
vector<int> tempres;
permuteRecur(num, 0, res, tempres);
return res;
}
void permuteRecur(vector<int> &num, int index, vector<vector<int>> &res, vector<int> &tempres)
{
if(index == num.size())
{
res.push_back(tempres);
return;
}
for(int i = index; i < num.size(); i++)
{
swap(num[index], num[i]);
tempres.push_back(num[index]);
permuteRecur(num, index+1, res, tempres);
tempres.pop_back();
swap(num[index], num[i]);
}
}
};
思路2:
采用DFS深搜的办法,并用一个数组标记该元素是否被访问过。
class Solution
{
public:
vector<vector<int>> permute(vector<int> &num)
{
vector<vector<int>> res;
vector<int> cur;
int n=num.size();
if(n == 0)
{
return res;
}
int *bit=new int[n]; //表示该元素是否被访问过
memset(bit,0,sizeof(int)*n);
DFS(res,cur,num,0,bit);
return res;
}
private:
void DFS(vector<vector<int>> &res,vector<int> &cur,vector<int> &num,int count,int *bit)
{
int n=num.size();
if(count==n)
{
res.push_back(cur);
return;
}
for(int i=0;i<n;i++)
{
if(!bit[i])
{
cur.push_back(num[i]);
bit[i]=1;
DFS(res,cur,num,count+1,bit);
bit[i]=0;
cur.pop_back();
}
}
}
};