🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**一. 题目描述** Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. The same repeated number may be chosen from C once number of times. Note:  • All numbers (including target) will be positive integers.  • Elements in a combination (a1, a2, …, ak) must be in non-descending order. (ie, a1 > a2 > … > ak).  • 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的解法类似,均可使用深度优先搜索来解。不同的是该题需要注意如何避免组合重复,因为不能重复,所以要跳过一样的数字。 例如:一个整数集合:[2 2 3],当我们要使用第二个2时,我们要检查他的前面一个2是否使用了,当未被使用时第二个2就不能使用;。 **三. 示例代码** ~~~ #include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution { public: vector<vector<int> > combinationSum2(vector<int> &candidates, int target) { vector<int> temp; // 用于存放临时组合 sort(candidates.begin(), candidates.end()); combinationDFS(candidates, temp, 0, target); return result; } private: vector<vector<int> > result; void combinationDFS(vector<int> &candidates, vector<int> &temp, size_t index, int target) { if (target == 0) { result.push_back(temp); return; } else { int prev = -1; for (size_t i = index; i < candidates.size(); ++i) { // 由于candidates中元素可能有重复,以下操作的意义是判断上轮循 // 环是否选择了candidates[i],是则跳过选择下一个candidates元素 // 直到下标到达比prev大的元素,选择该元素进行下一轮递归 if (prev == candidates[i]) continue; if (candidates[i] > target) return; prev = candidates[i]; temp.push_back(candidates[i]); combinationDFS(candidates, temp, i + 1, target - candidates[i]); temp.pop_back(); } } } }; ~~~ ![](https://box.kancloud.cn/2016-01-05_568bb5f14d58d.jpg) 四. 小结 相关题目参照: