排列组合专题
用回溯法求解。
1. Permutations
vector<vector<int> > permute(vector<int> &num) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<int>> res;
if(num.empty())
return res;
vector<bool> bvisited(num.size(),false);
vector<int> permu;
dfs(0,num,bvisited,permu,res);
return res;
}
void dfs(int cnt,vector<int>& num,vector<bool>& bvisited,vector<int>& permu,vector<vector<int>>& res)
{
if(cnt == num.size())
{
res.push_back(permu);
return;
}
for(int i=0;i<num.size();i++)
{
if(!bvisited[i])
{
bvisited[i] = true;
permu.push_back(num[i]);
dfs(cnt+1,num,bvisited,permu,res);
permu.pop_back();
bvisited[i] = false;
}
}
}
2.Permutations II
vector<vector<int> > permuteUnique(vector<int> &num) {
// Note: The Solution object is instantiated only once and is reused by each test case.
sort(num.begin(),num.end());
vector<vector<int>> res;
vector<int> permu;
vector<bool> bvisited(num.size(),false);
dfs(num,bvisited,permu,res);
return res;
}
void dfs(vector<int>& num,vector<bool>& bvisited,vector<int>& permu,vector<vector<int>>& res)
{
if(permu.size()==num.size())
{
res.push_back(permu);
return;
}
for(int i=0;i<num.size();i++)
{
if(bvisited[i]||(i>0&&num[i]==num[i-1]&&!bvisited[i-1]))
continue;
bvisited[i] = true;
permu.push_back(num[i]);
dfs(num,bvisited,permu,res);
permu.pop_back();
bvisited[i] = false;
}
}
3.Combinations C(n,k)
vector<vector<int> > combine(int n, int k) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<int>> res;
vector<int> path;
construct(1,n,k,path,res);
return res;
}
void construct(int pos,int& n,int k,vector<int>& path,vector<vector<int>>& res)
{
if(k==0)
{
res.push_back(path);
return;
}
if(n-pos+1<k)
return;
path.push_back(pos);
construct(pos+1,n,k-1,path,res);
path.pop_back();
construct(pos+1,n,k,path,res);
}
4.Combination Sum
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
// Note: The Solution object is instantiated only once and is reused by each test case.
sort(candidates.begin(),candidates.end());
vector<vector<int> > res;
vector<int> comb;
dfs(0,target,candidates,comb,res);
return res;
}
void dfs(int pos,int target,vector<int>& candidates,vector<int>& comb, vector<vector<int>>& res)
{
if(target==0)
{
res.push_back(comb);
return;
}
if(target<0)
return;
if(pos<candidates.size())
{
comb.push_back(candidates[pos]);
dfs(pos,target-candidates[pos],candidates,comb,res); //select candidates[pos];
comb.pop_back();
dfs(pos+1,target,candidates,comb,res); //not selected
}
}
5. Combination Sum II
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
// Note: The Solution object is instantiated only once and is reused by each test case.
sort(num.begin(),num.end());
vector<vector<int>> res;
vector<int> comb;
dfs(0,target,comb,res,num);
return res;
}
void dfs(int pos,int sum,vector<int>& comb,vector<vector<int>>& res,vector<int> &num)
{
if(sum==0)
{
res.push_back(comb);
return;
}
if(sum<0||pos==num.size())
return;
for(int i=pos;i<num.size();i++)
{
if(i>pos&&num[i]==num[i-1])
continue;
comb.push_back(num[i]);
dfs(i+1,sum-num[i],comb,res,num);
comb.pop_back();
}
}
6. Subsets II
vector<vector<int> > subsetsWithDup(vector<int> &S) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<int>> res;
vector<int> subset;
sort(S.begin(),S.end());
dfs(0,S,subset,res);
return res;
}
void dfs(int curpos,vector<int>& S,vector<int>& subset,vector<vector<int>>& res)
{
res.push_back(subset);
for(int i=curpos;i<S.size();i++)
{
if(i>curpos&&S[i]==S[i-1])
continue;
subset.push_back(S[i]);
dfs(i+1,S,subset,res);
subset.pop_back();
}
}
浙公网安备 33010602011771号