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