当前位置:   article > 正文

LeetCode39:组合总和

LeetCode39:组合总和

题目:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

提示:

1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都 互不相同
1 <= target <= 500

这道题的解题思路就是回溯和递归

用例子示意图表示:

 

回溯的意思就是如果加上这个元素不能够成为target值的话,可以直接返回上一数据

因为递归需要一个函数,所以我们在本道题中直接构建一个新函数dfs

  1. void dfs(vector<int> &cand, int x, int target)
  2. {
  3. if (target < 0)
  4. {
  5. return;
  6. }
  7. if (target == 0)
  8. {
  9. v.push_back(vet);
  10. return;
  11. }
  12. for (int i = x; i < cand.size(); i++)
  13. {
  14. vet.push_back(cand[i]);
  15. dfs(cand, i, target - cand[i]);
  16. vet.pop_back();
  17. }

如果每个target值减去组合中某一数值时,如果小于0,会用pop_back()删除最后的元素。

回溯到原来的组合中

需要在整个全局变量中定义一阶和二阶容器vector

  1. vector<int> vet;
  2. vector<vector<int>> v;

最后在主函数中调用dfs()函数,可以直接return 返回

完整代码:

  1. class Solution
  2. {
  3. vector<int> vet;
  4. vector<vector<int>> v;
  5. public:
  6. vector<vector<int>> combinationSum(vector<int> &candidates, int target)
  7. {
  8. dfs(candidates, 0, target);
  9. return v;
  10. }
  11. void dfs(vector<int> &cand, int x, int target)
  12. {
  13. if (target < 0)
  14. {
  15. return;
  16. }
  17. if (target == 0)
  18. {
  19. v.push_back(vet);
  20. return;
  21. }
  22. for (int i = x; i < cand.size(); i++)
  23. {
  24. vet.push_back(cand[i]);
  25. dfs(cand, i, target - cand[i]);
  26. vet.pop_back();
  27. }
  28. }
  29. };

欢迎各位读者的补充!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/472837
推荐阅读
相关标签
  

闽ICP备14008679号