• 【随想录】-【8 回溯算法】【组合问题】40 组合总和Ⅱ


    重点:

    (1)组合问题,子集问题,排列问题,棋盘问题,切割问题;

    (2)组合问题:从N个数里面挑选满足条件的k个;

    (3)for循环分布:背包内物品外组合,背包外物品内排列(兑换零钱);

    (4)组合问题:

             ——数组中无重复元素:使用一次(startIndex设为i+1即可,注意剪枝path.size和sum);不限次使用(startIndex设为i,用来去重,剪枝sum);

             ——有重复元素:肯定只使用一次,用used进行树层去重,只能是树层去重,不能树枝

    40. 组合总和 II

    难度中等1075

    给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

    candidates 中的每个数字在每个组合中只能使用 一次 。

    注意:解集不能包含重复的组合。 

    示例 1:

    输入: candidates = [10,1,2,7,6,1,5], target = 8,
    输出:
    [
    [1,1,6],
    [1,2,5],
    [1,7],
    [2,6]
    ]

    示例 2:

    输入: candidates = [2,5,2,1,2], target = 5,
    输出:
    [
    [1,2,2],
    [5]
    ]

    提示:

    • 1 <= candidates.length <= 100
    • 1 <= candidates[i] <= 50
    • 1 <= target <= 30

    解析:

    难点在于集合中有重复元素,每个元素只用一次,怎么去重。

    (1)首先肯定是startIndex每次设置为i+1,保证从下一个开始,再考虑下一个要是跟上一个元素相同的去重操作。

    (2)考虑怎么去重相同元素。

    思考,如果candidate[i-1]=candidate[i],说明与上一个元素相同。那么判断上一个是否用了,如果用了我们此时就不用。

    此处使用Used判断树层去重。不能树枝去重。

    代码:

    1. class Solution {
    2. private:
    3. vectorint>> res;
    4. vector<int> path;
    5. public:
    6. vectorint>> combinationSum2(vector<int>& candidates, int target) {
    7. vector<bool> used(candidates.size(), false);
    8. sort(candidates.begin(),candidates.end());
    9. backtracking(candidates,target,0,0,used);
    10. return res;
    11. }
    12. void backtracking(vector<int>& candidates,int target,int sum,int startIndex,vector<bool>& used){
    13. if(target==sum){
    14. res.push_back(path);
    15. return;
    16. }
    17. //剪枝,当某个数大于当前target时,停止本层
    18. for(int i=startIndex;isize()&&sum+candidates[i]<=target;i++){
    19. //使用树层去重
    20. if(i>0&&candidates[i-1]==candidates[i]&&used[i-1]==false)
    21. continue;
    22. path.push_back(candidates[i]);
    23. used[i]=true;
    24. backtracking(candidates,target,sum+candidates[i],i+1,used);
    25. //撤销回溯
    26. path.pop_back();
    27. used[i]=false;
    28. }
    29. }
    30. };
  • 相关阅读:
    上班用Python采集热搜榜,堪称摸鱼神器
    2024全国青少年电子信息智能创新大赛(决赛)python ·模拟四卷解析
    C++ Qt开发:Charts绘图组件概述
    推荐一个在线ide的网站
    推荐系统中的特征工程
    OpenJudge NOI 2.1 15:Counterfeit Dollar
    总结:数组常用方法
    【2022年11月15日提高A组】路径计数【DP】
    Day33力扣打卡
    【设计模式】使用策略模式优化表单校验逻辑
  • 原文地址:https://blog.csdn.net/zhuge2017302307/article/details/126427748