40. Combination Sum II

40. Combination Sum II

题目

 Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

Note:

    All numbers (including target) will be positive integers.
    The solution set must not contain duplicate combinations.

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:

[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

解析

  • 这道题跟之前那道 Combination Sum 组合之和 本质没有区别,只需要改动一点点即可,之前那道题给定数组中的数字可以重复使用,而这道题不能重复使用,只需要在之前的基础上修改两个地方即可,首先在递归的for循环里加上if (i > start && num[i] == num[i – 1]) continue; 这样可以防止res中出现重复项,然后就在递归调用combinationSum2DFS里面的参数换成i+1,这样就不会重复使用数组中的数字了
// add 40. Combination Sum ii
class Solution_40 {
public:

    void dfs(vector<vector<int>> &vecs, vector<int> &vec, int i, int target, vector<int> &candidates)
    {
        if (target == 0)
        {
            vecs.push_back(vec);
            return;
        }
        if (target < 0)
        {
            return;
        }
        // 1 1 2 5 6 (1,1,6;1 2 5)
        for (int k = i; k < candidates.size(); k++)
        {
            if (k>i && candidates[k] == candidates[k - 1]) //k>0 bug
            {
                continue;
            }
            vec.push_back(candidates[k]);
            dfs(vecs, vec, k+1, target - candidates[k], candidates);
            vec.pop_back();
        }
        return;
    }

    // 默认有序
    vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
        vector<vector<int>> vecs;
        vector<int> vec;
        if (candidates.size() == 0)
        {
            return vecs;
        }
        sort(candidates.begin(), candidates.end());
        dfs(vecs, vec, 0, target, candidates);

        return vecs;
    }
};

题目来源

    原文作者:ranjiewen
    原文地址: https://www.cnblogs.com/ranjiewen/p/8416604.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞