leetcode-39. 組合總和

 

看到此題回想到用回溯法枚舉可能的狀況。ide

class Solution {
public:
    vector<vector<int>> res;
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        if(candidates.size()==0)
            return res;
        for(int i = 0; i < candidates.size(); i++){
            cout<<"value: "<<candidates[i]<<endl;
        }
        vector<int> temp;
        sort(candidates.begin(), candidates.end());
        sumcandi(candidates,0,target,temp);
        // 先排序
        sort(res.begin(), res.end());
        // 在去重,unique時返回重複元素的其實位置
        //好比2 3 3 4 4
        // uniqueunique 回處理成2 3 4 3 4 ,返回第一個3的位置
        res.erase(unique(res.begin(), res.end()),res.end());
        return res;
    }

    void sumcandi(vector<int> candidates, int index, int value,vector<int> tmp){
        // index 索引。 valuevalue 剩餘值。tmp 保存序列
        if(index>=candidates.size())
            return;
        if(candidates[index] == value){
            tmp.push_back(candidates[index]);
            res.push_back(tmp);
            return;
        }
        // cout<<"sum: "<<sum<<endl;
        int sum = value-candidates[index];
        cout<<"sum: "<<sum<<endl;
        if(sum<0)
            return;
        tmp.push_back(candidates[index]);
        sumcandi(candidates,index,sum,tmp); // 對第當前元素重複
        sumcandi(candidates,index+1,sum,tmp); // 對下一個元素繼續
        tmp.pop_back();  // 回溯,彈出vector元素
        sumcandi(candidates,index+1,value,tmp);   // 對下個元素從新開始,注意剩餘值也變了
    }
};
相關文章
相關標籤/搜索