赞
踩
题目:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都 互不相同
1 <= target <= 500
这道题的解题思路就是回溯和递归
用例子示意图表示:
回溯的意思就是如果加上这个元素不能够成为target值的话,可以直接返回上一数据
因为递归需要一个函数,所以我们在本道题中直接构建一个新函数dfs
- void dfs(vector<int> &cand, int x, int target)
- {
- if (target < 0)
- {
- return;
- }
- if (target == 0)
- {
- v.push_back(vet);
- return;
- }
- for (int i = x; i < cand.size(); i++)
- {
- vet.push_back(cand[i]);
- dfs(cand, i, target - cand[i]);
- vet.pop_back();
- }
如果每个target值减去组合中某一数值时,如果小于0,会用pop_back()删除最后的元素。
回溯到原来的组合中
需要在整个全局变量中定义一阶和二阶容器vector
- vector<int> vet;
- vector<vector<int>> v;
最后在主函数中调用dfs()函数,可以直接return 返回
完整代码:
- class Solution
- {
- vector<int> vet;
- vector<vector<int>> v;
- public:
- vector<vector<int>> combinationSum(vector<int> &candidates, int target)
- {
- dfs(candidates, 0, target);
- return v;
- }
- void dfs(vector<int> &cand, int x, int target)
- {
- if (target < 0)
- {
- return;
- }
- if (target == 0)
- {
- v.push_back(vet);
- return;
- }
- for (int i = x; i < cand.size(); i++)
- {
- vet.push_back(cand[i]);
- dfs(cand, i, target - cand[i]);
- vet.pop_back();
- }
- }
- };
欢迎各位读者的补充!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。