• 40. 组合总和 II


    题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

     思路:

            关键点:去重

            不去重的结果

    没去重的代码(也就是我写的):

    1. class Solution {
    2. public:
    3. std::vectorint>> result;
    4. std::vector<int> res;
    5. vectorint>> combinationSum2(vector<int>& candidates, int target) {
    6. if(candidates.size() == 0) return result;
    7. sort(candidates.begin(), candidates.end());
    8. comb(candidates, target, 0);
    9. return result;
    10. }
    11. void comb(vector<int>& candidates, int target, int index)
    12. {
    13. int sum = 0;
    14. for(int i = 0; i < res.size(); i++)
    15. {
    16. sum += res[i];
    17. }
    18. if(index > candidates.size() && sum > target)
    19. {
    20. return;
    21. }
    22. if(sum == target)
    23. {
    24. result.push_back(res);
    25. return;
    26. }
    27. for(int i = index; i < candidates.size(); i++)
    28. {
    29. res.push_back(candidates[i]);
    30. comb(candidates, target, i+1);//注意这里是i+1,经常写成index+1
    31. res.pop_back();
    32. }
    33. }
    34. };

    随想录代码:

    1. class Solution {
    2. private:
    3. vectorint>> result;
    4. vector<int> path;
    5. void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
    6. if (sum == target) {
    7. result.push_back(path);
    8. return;
    9. }
    10. for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
    11. // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
    12. // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
    13. // 要对同一树层使用过的元素进行跳过
    14. if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
    15. continue;
    16. }
    17. sum += candidates[i];
    18. path.push_back(candidates[i]);
    19. used[i] = true;
    20. backtracking(candidates, target, sum, i + 1, used); // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次
    21. used[i] = false;
    22. sum -= candidates[i];
    23. path.pop_back();
    24. }
    25. }
    26. public:
    27. vectorint>> combinationSum2(vector<int>& candidates, int target) {
    28. vector<bool> used(candidates.size(), false);
    29. path.clear();
    30. result.clear();
    31. // 首先把给candidates排序,让其相同的元素都挨在一起。
    32. sort(candidates.begin(), candidates.end());
    33. backtracking(candidates, target, 0, 0, used);
    34. return result;
    35. }
    36. };

  • 相关阅读:
    根据三个点的坐标计算三角形面积
    代码随想录训练营day52
    如何构建spring boot maven骨架自动生成项目
    仙人掌之歌——大规模高速扩张(1)
    492.构造矩形
    【leetcode】小行星碰撞
    Jupyter Notebook交互式开源笔记本工具
    java--跳转关键字和随机数
    山东大学高频电子线路综合实验 调幅通信机系统实验详解
    ElasticSearch聚合查询
  • 原文地址:https://blog.csdn.net/weixin_44965579/article/details/133051129