现在的位置: 首页 > 综合 > 正文

leetcode Permutations & Permutations II

2019年04月02日 ⁄ 综合 ⁄ 共 1281字 ⁄ 字号 评论关闭

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;
    }
};

抱歉!评论已关闭.