题目:
给定一个无重复元素的正整数数组 candidates
和一个正整数 target
,找出 candidates
中所有可以使数字和为目标数 target
的唯一组合。
candidates
中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target
的唯一组合数少于 150
个。
示例 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]]
示例 3:
输入: candidates = [2], target = 1 输出: []
示例 4:
输入: candidates = [1], target = 1 输出: [[1]]
示例 5:
输入: candidates = [1], target = 2 输出: [[1,1]]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate
中的每个元素都是独一无二的。1 <= target <= 500
直接回溯算法解决这道题:
vector<vector<int>> re;vector<int> te;void backtrace(int target, vector<int>& candidates, int sum, int start) {// 如果当前相加的sum已经大于目标的target,则直接返回if (sum > target) {return;}// 如果当前的sum等于了target,则把符合条件的数组添加到re的二维数组中,并直接返回if (sum == target) {re.push_back(te);// 这里需要直接返回,而不是让sum=0return;}// 需要注意的是这里的i值不能直接等于0,而是等于start,从而可以保证获取到的数组与前面获取到的数组不同for (int i = start; i < candidates.size(); i++) {te.push_back(candidates[i]);sum += candidates[i];backtrace(target, candidates, sum, i);// 在执行完return以后需要将te中的数据pop出去,然后sum对应减去当前candidates[i]值te.pop_back();sum -= candidates[i];}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtrace(target, candidates, 0, 0);return re;}