1. 程式人生 > 其它 >LeetCode/組合數和

LeetCode/組合數和

給你一個無重複元素的整數陣列candidates和一個目標整數target,找出 candidates中可以使數字和為目標數 target的所有不同組合,並以列表形式返回,你可以按任意順序 返回這些組合
candidates中的同一個數字可以無限制重複被選取,如果至少一個數字的被選數量不同則兩種組合是不同的。

回溯法

每次選取候選陣列中的一位,預設第一位,遞迴選取該位以及後一位,避免重複遞迴,排序後使得演算法更加優化

class Solution {
public:
    vector<vector<int>> res;
    vector<int> temp;
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());//排序為了減少遞迴
        trackback(candidates,0,target);//從第一個數開始選
        return res;
    }

    void trackback(vector<int>& candidates,int i,int target){
        if(target==0){
            res.push_back(temp);//滿足條件記錄
            return;
        }
        for(;i<candidates.size();i++){
            if(target>=candidates[i]){
            temp.push_back(candidates[i]);
            trackback(candidates,i,target-candidates[i]);//遞迴下一次選取,往後選
            temp.pop_back();
            }
            else break;//不滿足直接跳出迴圈,因為後面的更不滿足
        }
    }
};