已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子集中的各个元素和为整数target的子集,结果中无重复的子集。
例如:nums[]=[10,1,2,7,6,1,5], target=8
结果为:[[1,7],[1,2,5],[2,6],[1,1,6]]
该题无论是回溯法或位运算法,整体时间复杂度为O(2^n)。
为了减小时间复杂度,在搜索回溯过程中应进行剪枝操作:
递归调用时,计算已选择元素的和sum,若sum>target,不再进行更深的搜索,直接返回。
#include<vector>
#include<algorithm>
class Solution
{
public:
Solution() {
};
~Solution() {
};
std::vector<std::vector<int>> combinationSum2
(std::vector<int>& candidates, int target)
{
std::vector<std::vector<int>> result;
std::vector<int> item;
std::sort(candidates.begin(), candidates.end());
generate(0, candidates, result, item, 0, target);