代码随想录:组合总和二

这题说实话有点晕晕乎乎的,最后直接把代码随想录的代码复制过来了。

要解决的问题是,尽管用了不同位置的相同元素,但是会产生相同的结果。

解决方法是排序后,跳过相同元素。

代码随想录那个used数组我属实没看懂,这个方法倒是看懂了。

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum,
                      int startIndex) {
        if (sum == target) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex;
             i < candidates.size() && sum + candidates[i] <= target; i++) {
            // 要对同一树层使用过的元素进行跳过
            if (i > startIndex && candidates[i] == candidates[i - 1]) {
                continue;
            }
            sum += candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates, target, sum, i + 1);
            sum -= candidates[i];
            path.pop_back();
        }
    }

public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {

        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0);
        return result;
    }
};
posted @ 2025-01-21 23:50  huigugu  阅读(3)  评论(0)    收藏  举报