题意
有一组无重复项的数字,求出其所有全排列。
思路
要求全排列,我们可以利用回溯算法,例如,假设当前已经求出了一个排列,则只要回溯到填入上两个数字的状态即可以得到一个新的排列,这样不停回溯就可以求出所有全排列。 代码如下:
class Solution {
public:
vector<vector<int> > ans;//存储答案用数组
bool used[10];//判断某个数字是否被使用过
int N;//数字个数
void dfs(vector<int> a,vector<int> &num)
{
if(a.size()==N){ans.push_back(a);return;}//若求出了一个排列将其存入答案
for(int i=0;i<N;i++)
{
if(!used[i]) //若未使用过n号数字
{
used[i]=true;
a.push_back(num[i]);//将n号数字放入排列
dfs(a,num);
a.pop_back();
used[i]=false;//回溯
}
}
}
vector<vector<int> > permute(vector<int> &num)
{
memset(used, false, sizeof used);
N=num.size();
dfs(vector<int>(),num);//开始搜索
return ans;
}
};
复杂度分析
时间复杂度:,为全排列个数。
空间复杂度:,为存储答案所用空间。