LeetCode(39):组合总和

Medium!数组

题目描述:函数

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中全部能够使数字和为 target 的组合。spa

candidates 中的数字能够无限制重复被选取。code

说明:blog

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

示例 1:递归

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

示例 2:ip

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

 

解题思路:get

像这种结果要求返回全部符合要求解的题十有八九都是要利用到递归,并且解题的思路都大同小异。io

若是仔细研究这些题目发现都是一个套路,都是须要另写一个递归函数,这里咱们新加入三个变量,start记录当前递归到的下标,out为一个解,res保存全部已经获得的解,每次调用新的递归函数时,此时的target都要减去当前数组里的数。class

C++ 解法一:

 1 class Solution {  2 public:  3     vector<vector<int> > combinationSum(vector<int> &candidates, int target) {  4         vector<vector<int> > res;  5         vector<int> out;  6  sort(candidates.begin(), candidates.end());  7         combinationSumDFS(candidates, target, 0, out, res);  8         return res;  9  } 10     void combinationSumDFS(vector<int> &candidates, int target, int start, vector<int> &out, vector<vector<int> > &res) { 11         if (target < 0) return; 12         else if (target == 0) res.push_back(out); 13         else { 14             for (int i = start; i < candidates.size(); ++i) { 15                 out.push_back(candidates[i]); 16                 combinationSumDFS(candidates, target - candidates[i], i, out, res); 17                 out.pop_back(); 18  } 19  } 20  } 21 };
相关文章
相关标签/搜索