LeetCode-40. Combination Sum II

Description

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

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

Note

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

Example 1

Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

Example 2

Input: candidates = [2,5,2,1,2], target = 5,
A solution set is:
[
  [1,2,2],
  [5]
]

Solution 1(C++)

class Solution {
public:
    vector<vector<int> > combinationSum2(vector<int> &num, int target) 
    {
        vector<vector<int>> res;
        sort(num.begin(),num.end());
        vector<int> local;
        findCombination(res, 0, target, local, num);
        return res;
    }
    void findCombination(vector<vector<int>>& res, const int index, const int target, vector<int>& local, const vector<int>& num)
    {
        if(target==0)
        {
            res.push_back(local);
            return;
        }
        else
        {
            for(int i = index;i<num.size();i++)
            {
                if(num[i]>target) return;
                if(i&&num[i]==num[i-1]&&i>index) continue; 
                local.push_back(num[i]),
                findCombination(res,i+1,target-num[i],local,num);
                local.pop_back();
            }
        }
    }
};

算法分析

完全可以拆分成两部分,找到不重复的子集中子集和等于target的。我试了试迭代的方法,稍微有点麻烦,但是递归就能很好解决。详情参考:LeetCode-90. Subsets II 解法一稍加更改即可。

程序分析

略。

猜你喜欢

转载自blog.csdn.net/zy2317878/article/details/80229114