LeetCode 39 Combination Sum

170 阅读1分钟

LeetCode 39 Combination Sum

思路

简单的backtracking。在回溯步骤中,通过参数cur记录已经遍历过的元素。

对于停止条件,起初只想到通过累加获得和(原始代码)。通过减法设置停止条件效率更高(优化代码)。

代码

原始代码

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        if (candidates.empty()) return {};
        
        sort(candidates.begin(), candidates.end());
        
        vector<vector<int>> rs;
        addCombination(rs, candidates, {}, target, 0);
        return rs;
    }
    
    void addCombination(vector<vector<int>> &rs, vector<int> &candidates, vector<int> combination, int &target, int cur) {
        if (cur == candidates.size()) return ;
        
        int total = 0;
        for (const auto &i : combination) {
            total += i;
        }
        
        if (total == target) {
            rs.push_back(combination);
            return ;
        }
        
        if (total > target) return ;
        
        for (int i = cur; i < candidates.size(); ++i) {
            combination.push_back(candidates[i]);
            addCombination(rs, candidates, combination, target, i);
            combination.pop_back();
        }
    }
};

优化代码

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        if (candidates.empty()) return {};
        
        sort(candidates.begin(), candidates.end());
        
        vector<vector<int>> rs;
        vector<int> combination;
        addCombination(rs, candidates, combination, target, 0);
        return rs;
    }
    
    void addCombination(vector<vector<int>> &rs, vector<int> &candidates, vector<int> &combination, int target, int cur) {
        if (!target) {
            rs.push_back(combination);
            return ;
        }
        
        for (int i = cur; i < candidates.size() && candidates[i] <= target; ++i) {
            combination.push_back(candidates[i]);
            addCombination(rs, candidates, combination, target - candidates[i], i);
            combination.pop_back();
        }
    }
};