Permutations 用一个标记数组记录已经使用的元素,然后,每次选取未选用过的元素,某一位置列举所有可能摆放在该位置的元素,递归处理所有位置即可
void myf(vector<int> &nu,vector<int> num,bool cont[], vector<vector<int> >&res,int k){ num.push_back(k); if(num.size()==nu.size()){res.push_back(num);return ;} for(int i=0;i<nu.size();i++){ if(!cont[i]){ cont[i]=true; myf(nu,num,cont,res,nu[i]); cont[i]=false; } } } class Solution { public: vector<vector<int> > permute(vector<int> &num) { vector<vector<int> >res; if(num.size()==0)return res; vector<int>t; bool cont[num.size()]; memset(cont,0,sizeof(cont)); for(int i=0;i<num.size();i++){ cont[i]=1; myf(num,t,cont,res,num[i]); cont[i]=0; } return res; } };
Permutations II 需要在上一题的基础上加上对于相同数据的处理,即每次对于一个位置,相同的数自取一次
void myf(vector<int> &nu,vector<int> num,bool cont[], vector<vector<int> >&res,int k){ num.push_back(k); if(num.size()==nu.size()){res.push_back(num);return ;} for(int i=0;i<nu.size();i++){ if(!cont[i]){ cont[i]=true; myf(nu,num,cont,res,nu[i]); cont[i]=false; while((i<nu.size()-1)&&(nu[i+1]==nu[i]))i++; } } } class Solution { public: vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int> >res; if(num.size()==0)return res; vector<int>t; bool cont[num.size()]; sort(num.begin(),num.end()); memset(cont,0,sizeof(cont)); for(int i=0;i<num.size();i++){ cont[i]=1; myf(num,t,cont,res,num[i]); cont[i]=0; while((i<num.size()-1)&&(num[i+1]==num[i])) i++; } return res; } };