排列组合专题

用回溯法求解。

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

  

posted @ 2013-10-19 16:09  summer_zhou  阅读(210)  评论(0编辑  收藏  举报