40. 组合总和 II

image.png

used数组去重

使用used进行标记来判断是否重复使用,
used[i-1]=true,代表同一树枝上(即上一层递归去当前层递归元素相同)
used[i-1]=false,代表同一树层(即for循环中当前循环和上一层循环元素相同,此时需要跳过)

  1. class Solution {
  2. public:
  3. void backtracking(vector<int>& candidates,int target,int startIndex,vector<bool> used)
  4. {
  5. if(target==0)
  6. {
  7. result.push_back(path);
  8. return;
  9. }
  10. for(int i=startIndex;i<candidates.size()&&target-candidates[i]>=0;i++)
  11. {
  12. if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==false)continue;
  13. // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
  14. // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
  15. // 要对同一树层使用过的元素进行跳过
  16. path.push_back(candidates[i]);
  17. used[i]=true;
  18. backtracking(candidates,target-candidates[i],i+1,used);
  19. used[i]=false;
  20. path.pop_back();
  21. }
  22. }
  23. vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
  24. vector<bool> used(candidates.size(),false);
  25. sort(candidates.begin(),candidates.end());
  26. backtracking(candidates,target,0,used);
  27. return result;
  28. }
  29. vector<vector<int>> result;
  30. vector<int> path;
  31. };

startIndex去重

直接判断for循环过程中,i元素和i-1元素是否相同,相同就跳过

  1. class Solution {
  2. public:
  3. void backtracking(vector<int>& candidates,int target,int startIndex)
  4. {
  5. if(target==0)
  6. {
  7. result.push_back(path);
  8. return;
  9. }
  10. for(int i=startIndex;i<candidates.size()&&target-candidates[i]>=0;i++)
  11. {
  12. //去重
  13. if(i>startIndex&&candidates[i]==candidates[i-1])continue;
  14. path.push_back(candidates[i]);
  15. backtracking(candidates,target-candidates[i],i+1);
  16. path.pop_back();
  17. }
  18. }
  19. vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
  20. sort(candidates.begin(),candidates.end());
  21. backtracking(candidates,target,0);
  22. return result;
  23. }
  24. vector<vector<int>> result;
  25. vector<int> path;
  26. };