1.无重复元素排列
class Solution {
public:
vector<vector<int>>res;
vector<bool>st;
vector<int>ans;
void dfs(int k,vector<int>&nums)
{
if(k==nums.size())
{
res.push_back(ans);
return ;
}
for(int i=0;i<nums.size();i++)
{
if(st[i]) continue;
st[i]=true;
ans[k]=nums[i];
dfs(k+1,nums);
st[i]=false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
st=vector<bool>(nums.size());
ans=vector<int>(nums.size());
dfs(0,nums);
return res;
}
};
2.有重复元素排列
class Solution {
public:
//保证对于相同数字来说不改变相对顺序,所以选取相同的数字从前往后挨个用
//嫡长子继承制
vector<vector<int>>res;
vector<int>ans;
vector<bool>st;
void dfs(int k,vector<int>&nums)
{
if(k==nums.size())
{
res.push_back(ans);
return ;
}
for(int i=0;i<nums.size();i++)
{
if(!st[i])
{
if(i&&nums[i]==nums[i-1]&&!st[i-1])continue;
st[i]=true;
ans[k]=nums[i];
dfs(k+1,nums);
st[i]=false;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
ans=vector<int>(nums.size());
st=vector<bool>(nums.size());
sort(nums.begin(),nums.end());
dfs(0,nums);
return res;
}
};