当前位置:   article > 正文

Leetcode刷题笔记题解(C++):40. 组合总和 II_sort(candidates.begin(), candidates.end());

sort(candidates.begin(), candidates.end());

思路:DFS查找

1. 首先对数组进行排序,方便查找的时候如果当前元素加入之后超出target,那么后面的元素就不需要再加了

2.然后进行DFS查找,如果满足要求则输出到结果中

3.注意的是出现重复的组合要避免,

代码如下:

  1. class Solution {
  2. public:
  3. vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
  4. vector<int> temp;
  5. //进行排序
  6. sort(candidates.begin(),candidates.end());
  7. //进行dfs查找结果
  8. dfs(candidates,target,temp,0);
  9. return res;
  10. }
  11. //存放结果
  12. vector<vector<int>> res;
  13. void dfs(vector<int>& candidates, int target,vector<int> temp,int index){
  14. //如果目前组合里面的sum==target,则是一个符合要求的组合
  15. if(target==0){
  16. res.push_back(temp);
  17. return;
  18. }
  19. //进行遍历找到合适的组合
  20. for(int i=index;i<candidates.size();i++){
  21. //如果当前元素与上一个元素相等且当前i不是第一个元素,比如 1 1 1 6 第一次取了1(first) 1(second) 6,走到第二个1(second) 1(third) 6就不能再取了
  22. if(i > index && candidates[i]==candidates[i-1]) continue;
  23. //如果加入当前元素会超出target的值,则跳出,因为后面的数更大,还会超出
  24. if(target-candidates[i]<0) break;
  25. //存入当前元素
  26. temp.push_back(candidates[i]);
  27. //接着往下遍历
  28. dfs(candidates,target-candidates[i],temp,i+1);
  29. //弹出之前元素
  30. temp.pop_back();
  31. }
  32. return;
  33. }
  34. };

 

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

闽ICP备14008679号