1. 程式人生 > >leetcode 39:組合總和

leetcode 39:組合總和

         同樣是一個遞迴的題,類似與leetcode17。首先將輸入的陣列排序,這樣能夠保證先從小的數開始取,為了使得結果也是有序的,不至於重複,取一個數a要看是否大於等於已經取的數。

比如candidates=[2,3,7],target=14

如果已經取了[2,3], 再取時只能取大於等於3的數

如果沒有這個限制

[2,2,3,3,2,2]

[3,3,2,2,2,2]均為答案

void combination(std::vector<std::vector<int>> &a,std::vector<int> v,std::vector<int> candidates,int target){
    if(target==0){
        a.push_back(v);
        return;
    }
    for(int i=0;i<candidates.size();i++){
        std::vector<int> v1=v;
        if(v.size()!=0){
            int d=v1.back();
            if(d>candidates[i])
                continue;
        }
        int c=target;
        c=target-candidates[i];
        if(c>=0){
            v1.push_back(candidates[i]);
            combination(a,v1,candidates,c);
        }else{
            return;
        }
    }
}

std::vector<std::vector<int>> combinationSum(std::vector<int>& candidates, int target) {
    std::vector<std::vector<int>> a;
    std::vector<int> v;
    std::sort(candidates.begin(),candidates.end());
    combination(a,v,candidates,target);
    return a;
}