20210419-组合总和
Posted 茴薏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20210419-组合总和相关的知识,希望对你有一定的参考价值。
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
解题思路
欢迎大家关注,我会持续更新刷题题解,希望对大家有所帮助!
此题考查的是回溯算法内容里的组合总和问题。
重点概况:
·如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法;
·回溯算法是在一棵树上的 深度优先遍历(因为要找所有的解,所以需要遍历);
剪枝操作:
1.在递归终止的地方剪枝,也就是if(sum > targetSum)进行剪枝操作
2.在for循环的搜索范围上,也就是sum + candidates[i] 已经大于target,就可以结束本轮for循环。
class Solution
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, 0);
return result;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex)
if(sum > target)
return;
if(sum == target)
result.push_back(path);
return;
for(int i = startIndex; (i < candidates.size()) && (sum + candidates[i] <= target); ++i)
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i);
sum -= candidates[i];
path.pop_back();
private:
vector<int> path;
vector<vector<int>> result;
;
以上是关于20210419-组合总和的主要内容,如果未能解决你的问题,请参考以下文章