致我们终将忘记的算法(暴力枚举)

1->求一个集合的全部子集

解题方法:对于每个元素,有两种选择,要么输出,要么不,采用递归的方式可以解决。

vector<vector<int> > subsets(vector<int> &s){

    sort(s.begin(),s.end());

    vector<vector<int> > result;

    vector<int> path;

    subsets(s,path,0,result);

   return result;

}

void subsets(const vector<int>&s,vector<int>&path,int step,vector<int>&result){

    if(step==s.size()){

         result.push_back(path);   return;

    }

    subsets(s,path,step+1,result);

    path.push_back(s[step]);

    subsets(s,path,step+1,result);

    path.pop_back();

}


2->包含重复元素的集合,求其所有的子集

vector <vector<int> > subsetsWithDup(vector<int> &s){

    sort(s.begin(),s.end());

    vector<vector<int> > result;

    vector<int> path;

    helper(s,s.begin(),path,result);

    return result;

}

void helper(const vector<int> &s,vector<int>::iterator start,vector<int> &path,vector<vector<int> >&result){

    result.push_back(path);

    for(vector<int>::iterator it=start;it<s.end();it++){

         if(it!=start &&*it==*(i-1)) continue;

         path.push_back(*it);

         helper(s,it+1;path,result);

         path.pop_back();

    }

}


3->求出一个集合的全排列不包含重复数值

vector<vector<int> > permute(vector<int> & num){

    sort(num.begin(),num.end());

    vector<vector<int> > result;

    vector<int> path;

    helper(num,path,result);

    return result;

}

void helper(const vector<int>& num,vector<int>&path,vector<vector<int> >&result){

    if(path.size()==num.size()){

        result.push_back(path); return ; 

    }

    for(vector<int>::iterator it=num.begin();it!=num.size();it++){

        vector<int>::iterator pos=find(path.begin(),path.end(),*it);

        if(pos==path.end()){

             path.push_back(*it);

             helper(num.path,result);

             path.pop_back();

        }

    }

}


4->全排列当元素出现重复的情况

vector <vector<int> > premuteUnique(vector<int>& num){

    sort(num.begin(),num.end());

    map<int,int> count_map;

    for(num.begin()->num.end()){

        if(count_map.find(num[i])!=count_map.end())

             count_map[num[i]]++;

        else

             count_map[num[i]]=1;

    }

    vector<pair<int,int> >elems(count_map.begin(),count_map.end());

    vector<vector<int> > result;

     vector<int> p;

     premute(elems.begin(),elems.end(),p,result);

     return result;

}

void premute(Iter first,Iter last,vector<int> &p,vector<vector<int> >&result){

   if(p.size()==num.size()){

          result.push_back(p); return;

   }

   for(auto i=first;i!=last;i++){

        int count=0;

        count=count(p.begin(),p.end());

        if(count<i->second){

                p.push_back(i);   premute(first,last,[,result); p.pop_back();

        }

   }

}


5->Combinations 给出一个整数n求出以1到n为元素长度为k的全部集合

vector <vector<int> > combine(int n,int k ){

    vector<vector<int> > result;

    vector<int> path;

     helper(n,k,1,0,path,result);

     return result;

}

void helper(int n,int k,int start,int cur,vector<int>& path,vector<vector<int> >&result){

    if(cur==k){result.push_back(path); return ;}

    for(int i=start;i<=n;i++){

         path.push_back(i);  helper(n,k,i+1,cur+1,path,result); path.pop_back(); path.pop_back();

    }

}


6->给出一串整数,输出在手机面板上可以代表的字符的组合

const vector<string> keyboard{" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

vector<string> letterCombinations(const string &digits){

    vector<string> result;

    helper(digits,0,"",result);

    return result;

}

void helper(const string &digits,int cur,string path,vector<string> &result){

    if(cur==digits.size()){result.push_back(path); return ;}

    for(auto c:keyboard[digits[cur]-'0']){

           helper(digits,cur+1,path+c,result);

    }

}

发布了99 篇原创文章 · 获赞 8 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/CodeAsWind/article/details/39225823