当前位置: 首页 > article >正文

组合总和II(力扣40)

这道题的难点就在于题目所给的集合中有重复的数字,我们需要进行去重操作。首先明确去重指的是去重哪一部分。注意并不是对递归的集合去重,而是对当前集合的遍历进行去重。这么说可能有点抽象,举个例子:假设集合为1,1,2,3,4,我们第一次选1,递归集合时,我们仍可以选择第二个1。但是在第一次选第二个1时,在往下选,就会出现很多与第一次选第一个1时相同的组合。所以在每一层递归函数的for循环中我们需要进行去重。不过,我们需要判断这个重复出现的数字是在当前这层递归的for循环中还是在下一层递归的for循环中。于是,我们创建了一个数组,标识这些集合中的数字是否被使用过,如果被使用过,说明是在上一层递归中被使用,如果没有被使用,说明是在当前这一层递归的for循环中。大家可以结合我下面的代码及详细注释理解。

代码及详细注释如下:

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& candidates,int target,int sum,int start,vector<int>& used){
            //剪枝
            if(sum > target){
                return;
            }
            //终止条件
            if(sum == target){
                result.push_back(path);
                return;
            }

            for(int i = start;i < candidates.size();i++){
                //去重
                if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == 0){
                    continue;
                }
                path.push_back(candidates[i]);
                sum += candidates[i];
                used[i] = 1;
                backtracking(candidates,target,sum,i + 1,used);
                //回溯
                path.pop_back();
                sum -= candidates[i];
                used[i] = 0;
            }
            return;
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        //创建一个数组,该数组下标对应集合中元素的下标,表示集合中各个下标对应的数字有没有使用过
         vector<int> used(candidates.size(),0);

        sort(candidates.begin(),candidates.end());
        backtracking(candidates,target,0,0,used);
        return result;
    }
};


http://www.kler.cn/a/537189.html

相关文章:

  • 腾讯云TI平台×DeepSeek:开启AI超强体验,解锁部署秘籍
  • 大语言模型遇上自动驾驶:AsyncDriver如何巧妙解决推理瓶颈?
  • C++ 课程学习笔记:从对象生命周期看资源管理之道
  • DKG(Distributed Key Generation)协议
  • RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)
  • 【漫画机器学习】083.安斯库姆四重奏(Anscombe‘s Quartet)
  • centos7-mini-2009下载docker
  • Cloudflare 2024 网络流量回顾:洞悉网络发展趋势与安全挑战
  • 数据库读写分离、事务的特性、事务隔离级别及默认级别、脏读不可重复读和幻读、更新丢失问题、写偏斜问题、MVCC
  • 【开源免费】基于SpringBoot+Vue.JS智能学习平台系统(JAVA毕业设计)
  • 通过AutoHotkey将Windows按键修改为Mac的快捷键并设置开机自启动
  • 问题大集04-浏览器阻止从 本地 发起的跨域请求,因为服务器的响应头 Access-Control-Allow-Origin 设置为通配符 *
  • Vue3.5 企业级管理系统实战(五):图标组件
  • 远程 IO 模块:汽车零部件产线的高效生产引擎
  • AI智算-k8s部署DeepSeek Janus-Pro-7B 多模态大模型
  • 探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变
  • selenium使用
  • Stable Diffusion的入门介绍和使用教程
  • 如何在Swift中实现基本的UI设计?
  • AI眼镜-推理成本降低将加速端侧硬件智能化-AI 眼镜、AI玩具、手机AI化
  • Mixture of Experts(专家混合模型)深入解析:突破传统神经网络的计算瓶颈
  • unity学习32:角色相关1,基础移动控制
  • 课程知识图谱生成系统设计与实现
  • 【Android】版本和API对应关系表
  • BUU27 [SUCTF 2019]CheckIn1
  • Android开发经验谈:2021年Android网络编程总结篇,经典好文_android网络编程心得