LeetCode 中级 - 组合总和(105)

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

candidates 中的数字可以无限制重复被选取。

说明:

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

示例 1:

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

思路: 深度优先搜索
       class Solution {
public:
    void dfs(vector<int> candidates,int start,int target,vector<int> item,vector<vector<int> > &res)
    {
        if(target<0)
            return ;
        if(target==0)
        {
            res.push_back(item);
            return ;
        }
        for(int i=start;i<candidates.size();i++)
        {
            item.push_back(candidates[i]);
            dfs(candidates,i,target-candidates[i],item,res);//注意参数i,可以选择重复元素而又可以保证不会发生重复(i一直是递增的)
            item.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int> > res;
        vector<int> item;
        // item保存当前dfs的解空间
        // res保存所有满足条件的解
        dfs(candidates,0,target,item,res);
        return res;
    }
};
   

 

posted @ 2019-04-04 20:07  小新猩  阅读(166)  评论(0编辑  收藏  举报