LeetCode 40 Combination Sum II

205 阅读1分钟

LeetCode 40 Combination Sum II

思路

此题与Combination Sum的不同之处在于,此题中,每个元素只能用一次。而原题中,每个元素可以用多次。因此在原题中递归调用时,表示位置的参数为i,combination(rs, candidates, com, target - candidates[i], i)。在本题中,由于每个元素只能用一次,因此,最后一个参数使用i+1,下次递归从当前元素的下一个元素开始扫描,combination(rs, candidates, com, target - candidates[i], i + 1)。内部循环将重复的元素跳过。

代码

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