LeetCode 39. 组合总和(Combination Sum)

题目描述

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

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

说明:

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

示例 1:

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

示例 2:

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

解题思路

考虑用回溯法解题。首先将数组从小到大排序,然后从第一个数字开始遍历,若该数字不大于当前目标值,则将其加入到结果数组中,然后把目标值减去当前数字,并从当前数字开始向后递归寻找下一个满足上述条件的数字。若到某一步为止目标值为0,则将当前结果数组加入到集合中。每个数字向后遍历完之后,将其从结果数组中去除,从下一个数字开始继续寻找,直到走到数组末尾或者没有不大于目标值的数。

代码

 1 class Solution {
 2 public:
 3     vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
 4         sort(candidates.begin(),candidates.end());
 5         vector<vector<int>> res;
 6         vector<int> temp;
 7         if(candidates.size())
 8             combi(candidates,target,temp,res,0);
 9         return res;
10     }
11     void combi(vector<int>& candidates, int target, vector<int>& temp, vector<vector<int>>& res, int start){
12         if(target==0)
13             res.push_back(temp);
14         else{
15             int i=start;
16             while(i<candidates.size()&&candidates[i]<=target){
17                 temp.push_back(candidates[i]);
18                 combi(candidates, target-candidates[i], temp, res, i);
19                 temp.pop_back();
20                 i++;
21             }
22         }
23     }
24 };
原文地址:https://www.cnblogs.com/wmx24/p/9015634.html