leetcode题库——组合总和II

题目描述:

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

  • 所有数字(包括目标数)都是正整数。
  • 解集不能包含重复的组合。 

示例 1:

输入: candidates = [10,1,2,7,6,1,5],target=8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]

方法:深搜

class Solution {
public:
    vector> res;
    vector flag;
    vector> combinationSum2(vector& candidates, int target) {
        if(candidates.size()==0) return res;
        int sum=0;
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,sum,0);
        return res;
    }
    void dfs(vector& candidates, int target,int sum,int j){
        if(sum

思路:

 注意:此次题目与上个不同,每个数字只能用一次,所以每次加的数必须是当前这个数之后的数,不可以加当前这个数及其之前的数,不然会重复,这里设i=j,每次迭代j=i+1实现。

同时,每次的结果不能重复,所以需要去重,这里需要先将给定的candidates进行排序,然后每次pop不符合条件的数字,紧接着检查,下一个数字是否跟被pop的数字相同,如果相同,就跳过该数字。

 

你可能感兴趣的:(leetcode题库)