无重复数字
描述
给出一组数字,返回该组数字的所有排列
例如: [1,2,3]的所有排列如下:
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)
核心代码
vector<vector<int> > res;
vector<int> cur;
vector<bool> vis;
void recursion(vector<int> num){
if(cur.size()==num.size())
{
res.push_back(cur);
return;
}
for(int i=0;i<num.size();++i)
{
if(!vis[i])
{
cur.push_back(num[i]);
vis[i]=true;
recursion(num);
cur.pop_back();
vis[i]=false;
}
}
}
vector<vector<int> > permute(vector<int> &num) {
//sort(num.begin(), num.end())
vis=vector<bool>(num.size(),false);
recursion( num);
return res;
}
有重复数字
描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
数据范围: 0<n≤8 ,数组中的值满足 −1≤val≤5
要求:空间复杂度 O(n!),时间复杂度 O(n!)
核心代码
vector<vector<int> > res;
vector<int> cur;
vector<bool> vis;
void recursion(vector<int> num){
if(cur.size()==num.size())
{
res.push_back(cur);
return;
}
vector<bool> vis2;
vis2=vector<bool>(7,false);
for(int i=0;i<num.size();++i)
{
if(!vis[i]&&!vis2[1+num[i]])
{
cur.push_back(num[i]);
vis[i]=true;
vis2[1+num[i]]=true;
recursion(num);
cur.pop_back();
vis[i]=false;
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vis=vector<bool>(num.size(),false);
recursion( num);
return res;
}