自学内容网 自学内容网

LeetCode40:组合总数II

题目链接:40. 组合总和 II - 力扣(LeetCode)

代码如下:

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used)
    {
        if(target == sum)
        {
            result.push_back(path);
            return ;
        }
        for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)
        {
            if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false)
            {
                continue;
            }   
            sum += candidates[i];
            path.push_back(candidates[i]);
            used[i] = true;
            backtracking(candidates, target, sum, i + 1, used);
            used[i] = false;
            sum -= candidates[i];
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<bool> used(candidates.size(), false);
        path.clear();
        result.clear();
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0, used);
        return result;
    }
};

这个题目和上一个组合分析不一样的是,这个题目每个数只能用一次,所以这个需要先对数组进行排序,为什么要排序呢,因为当你抽象成一个数的时候,这个时候如果不排序的话,那么你会得到之前就已经得到过的数组。

回溯三步走:

参数的设定:1.需要原数组,2.需要目标值,3.需要总和sum,4.需要bool类型的数组,用来标记

结束条件:也就是说当你回溯了这么多数之后,sum相加,等于target的话,那么就停止

单层循环语句:里面就是需要对于排序过的数组进行标记,比如[1, 1, 2],那么这个时候就特别需要注意这个1,1,不要让这个两个重复出现了。


原文地址:https://blog.csdn.net/Ricky_youngone/article/details/143884911

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!