39. Combination Sum

来源:互联网 发布:恋爱的双马尾 知乎 编辑:程序博客网 时间:2024/06/07 19:07

Related Topics:Backtracking

回溯法,或称DFS,肯定是要用函数的递归。

每次将元素加进队列里,如果结果大于target就pop,等于target就将队列加进新的队列里,小于target就继续嵌套。



class Solution {

public:
    void swap(int& e1, int& e2){
        int tmp = e1;
        e1 = e2;
        e2 = tmp;
    }

    void quickSort(vector<int>& a, int l, int r){    //c语言改成int*
        if(l >= r) return;
        int ref = a[l];
        int lt = l;
        int gt = r;
        int i = l + 1;
        while(i<=gt){
            if(a[i] < ref) swap(a[i++], a[lt++]);
            else if(a[i] > ref) swap(a[i], a[gt--]);
            else ++i;
        }
        quickSort(a, l, lt - 1);
        quickSort(a, gt + 1, r);
    }
    
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> result;
        vector<int> temp;
        int count=0;
        quickSort(candidates, 0, candidates.size()-1);
        combination(candidates,count,target,temp,result);
        return result;

    }
    
    void combination(vector<int>& candidates,int count, int target,vector<int> &temp,vector<vector<int>> &result){
        if(target==0){
            result.push_back(temp);
            return;
        }
        
        for(int i=count;i<candidates.size();i++){
            if(target<0){
                return;
            }
            temp.push_back(candidates[i]);
            combination(candidates,i,target-candidates[i],temp,result);
            temp.pop_back();
        }
    }
};
原创粉丝点击