[leetcode]39.组合总数

给定一个无重复元素的数组 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]
]

思路:dfs剪枝
从头开始遍历candidates数组,对于每一个元素,都有两种可能,1,答案中选这个数,2.答案中不选这个数。分别进行dfs,递归边界为临时数组temp中的元素之和等于target,将target压入答案ans中,返回。
剪枝:当数组中的元素之和已经大于target时,没有必要继续向下递归了,直接返回即可。

AC代码:(C++)

class Solution {
   public:
    vector<int> temp;  //保存临时答案
    void dfs(vector<vector<int>>& ans, vector<int>& candidates, int target,
             int sum, int n, int index) {
        if (sum == target) {
            ans.push_back(temp);  //保存结果
            return;
        }
        if (index == n || sum > target)
            return;  //剪枝,当已经处理完n个数或者sum大于target时不再继续
        //选index号数
        temp.push_back(candidates[index]);
        dfs(ans, candidates, target, sum + candidates[index], n, index);
        //不选index号数
        temp.pop_back();
        dfs(ans, candidates, target, sum, n, index + 1);
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> ans;  //保存答案
        int n = candidates.size();
        dfs(ans, candidates, target, 0, n, 0);
        return ans;
    }
};

你可能感兴趣的:(LeetCode)