leetcode题库——组合总和II

版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83898630

题目描述:

给定一个数组 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<vector<int>> res;
    vector<int> flag;
    vector<vector<int>> combinationSum2(vector<int>& 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<int>& candidates, int target,int sum,int j){
        if(sum<target){
            for(int i=j;i<candidates.size();i++){
                flag.push_back(candidates[i]);
                dfs(candidates,target,sum+candidates[i],i+1);
                flag.pop_back();
                while(candidates[i]==candidates[i+1]&&i<candidates.size()-1) i++;
            }
        }
        if(sum==target) res.push_back(flag);  
    }
};

思路:

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

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

 

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/83898630