有关回溯问题,总结的细致要点

news2024/10/6 8:30:11

目录

对于这三类问题的去重我总结的模板,直接用:

组合:

子集:

排列:

总结:

三类回溯问题框架都是

if ...终止
    
    for  遍历
        递归

三类问题都抽象成树 dfs

  1. 对于组合子集问题,需要用到index
  2. 对于排列问题不用index但是要用used数组,来标记已经选择的元素,可以放全局,也能以引用放到参数里
  3. 为啥?因为排列不用index,就是每次从0开始遍历,used就是记录当前选择的这个值,然后递归进去之后还是从0开始遍历,是一定会再次碰到已选择的这个数的,used就是判断如果这个数已选择了,就continue
  4. 三类问题,子集问题好比取所有结点,所以if里面不用return,因为还要向下继续去取,,组合和排列if说明取到符合条件的了,那就return,返回上层,再找别的
  5. 对于三类问题的去重问题,注意 要去重,一定要把数据数组排序

去重的话,其实都是树层上需要去重,举个例子 1 2 1 , 目标和是3,,排序 1 1 2 ,比如求组合选定了第一个1 ,递归进去,再选择就是树枝上,就是往下延伸,懂吗。然后就得到 1 2,拿到结果了 ,递归返回去,到了for取第一个1这块,ok完了for遍历下一个,又是1 那肯定这个1就不能取了,,如果取的话又是 会取到第二个1 和2组成的一组结果,,但是这个其实是重复的

  • 其实发现了没,这个树层抽象的就是for循环这个 当前循环里面++所变化, for循环遍历 0 1 2 3,这就是同一层
  • 树枝向下就是进到递归

对于这三类问题的去重我总结的模板,直接用:

组合的:

组合去重:

用used数组初始化false,记录当前层这个值用过没

used数组最好别用bool,用int好点,我后面出文章说为啥少用vector<bool>

我推荐的写法: 不用used了

for里面加   
    // 要对同一树层使用过的元素进行跳过
if (i > index&& nums[i] == nums[i - 1]) {
                continue;
            }

也能用set去重

 
 unordered_set<int> uset; // 控制某一节点下的同一层元素不能重复
   
 for i=index

      if (uset.count(nums[i])) {
                continue;
      
      uset.insert(candidates[i]); // 记录元素
        
        递归
        注意递归完了set不用erase,,因为set是记录每层,每层都会创建一个的

子集:


if..
   不return
for i=index...
    递归 

子集要去重的:

和组合没啥区别,组合的去重方法根子集的是一样的,三种都可以

而且他俩都用index, 唯一的区别就是if 有没有return的问题

所以子集我还是推荐这种去重写法:

for里面加   
    // 要对同一树层使用过的元素进行跳过
if (i > index&& nums[i] == nums[i - 1]) {
                continue;
            }

排列:

不用index了,但是额外加个used判定数组,used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。其实就是前面两类用来去重的used数组,只不过对于排列他,哪怕不去重也得用

排列去重:

用他本身的used数组

 或者用set去重:

总结:

组合和子集,三种不同的去重方式,个人推荐,这种,代码少

if(i>startindex&&nums[i]==nums[i-1])
{
    continue;
}

排列,两种去重,哪个都行

其实看完会发现,就他们的去重方式都是一模一样的,理解抽象什么时候去重同一层数据,三种方式,自然而然就写出来了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试的概念与过程----学习软件测试前的思考

软件测试的概念与过程----学习软件测试前的思考 1、软件测试工作是做什么的&#xff1f;2、那我做软件测试拿到一个软件产品我应该从哪里测试&#xff0c;怎末开始工作&#xff1f;3、测试早做好还是晚一些做好&#xff1f;4、软件测试能将软件测试的一点问题都没有嘛&#xff…

蓝牙无线耳机哪个品牌好?盘点前七名无线蓝牙耳机分享

本文将为您详细介绍每款蓝牙耳机的设计特点、音质表现、续航能力和智能功能等关键信息。我们将提供客观、全面的分析&#xff0c;帮助您更好地了解每款产品的优势和适用场景&#xff1b;无论您是追求高保真音质的音乐发烧友&#xff0c;还是需要轻便舒适的耳机进行运动&#xf…

好选客干货分享:矿物燃料找外贸客户

矿物燃料概述 矿物燃料&#xff0c;也称化石燃料&#xff0c;是由数百万年来的动植物遗骸形成的自然资源&#xff0c;也是人类社会中重要的能源来源之一&#xff0c;主要包括煤炭、石油和天然气。 Image by PublicDomainPictures via Pixabay 在商品类章27章中&#xff0c;矿物…

HashMap的底层实现原理

红黑数演示地址&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 一、构造源码解读 public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {//1、实现了两个Map接口 &#xff0c;…

【金融量化】购买了多只基金,如何进行资产分配?如何基金组合配置?

【金融量化】购买了多只基金&#xff0c;如何进行资产分配&#xff1f;如何基金组合配置&#xff1f; 1 概念 FOF&#xff08;Fund of fund&#xff09;&#xff0c;即基金中基金&#xff0c;是一种投资于其他投资基金的基金。说白了&#xff0c;就是基金经理是买入多只基金取…

Day_56-57kMeans 聚类

目录 Day_56-57 k-Means 聚类 一. 基本概念介绍 二. 具体过程 三. 代码实现与解释 1. 导入数据与数据初始化 2. 核心代码 3. 后续信息的补充 4. 距离计算和随机排列 四. 后续的数据分析 五. 运行结果 Day_56-57 k-Means 聚类 一. 基本概念介绍 同我上一篇博客的介绍&…

微博视频发布软件有哪些

微博视频发布软件有哪些&#xff0c;新的新浪微博怎么发微博#科技#手机操作#微信 软件有月卡、季卡、半年卡、年卡 【引流脚本软件发帖顶帖有货】 服务时间&#xff1a;&#xff08;8&#xff1a;00—23&#xff1a;00&#xff09; 需要观看软件操作视频教程的可关注↑↑↑上…

大数据开发技术与实践期末复习(HITWH)

目录 分布式文件处理系统HDFS 分布式文件系统 HDFS简介 块&#xff08;block&#xff09; 主要组件的功能 **名称节点 FsImage文件 名称节点的启动 名称节点运行期间EditLog不断变大的问题 SecondaryNameNode的工作情况 数据节点 HDFS体系结构 HDFS体系结构的局限…

游戏行业黑马昆仑万维,国产AI巨头崛起

游戏行业黑马昆仑万维&#xff0c;国产AI巨头崛起&#xff0c;其大模型技术堪比ChatGPT 随着人工智能技术的快速发展&#xff0c;越来越多的公司参与大规模语言模型的开发和应用。近日&#xff0c;昆仑万维正式发布大型语言模型“天宫”&#xff0c;宣布即日起开始邀请测试&am…

操作系统——基于信号量机制的并发程序设计

一、实验题目 基于信号量机制的并发程序设计 二、实验目的 (1) 回顾操作系统进程、线程的有关概念&#xff0c;针对经典的同步、互斥、死锁与饥饿问题进行并发 程序设计。 (2) 了解互斥体对象&#xff0c;利用互斥与同步操作编写读者-写者问题的并发程序&#xff0c;加深…

测试老鸟,带你手写Python自动化测试 ddt 数据驱动框架(超细细)

前言 python做自动化测试&#xff0c;大多数都应该使用过ddt这个模块&#xff0c;它可以自动根据用例数据&#xff0c;来生成测试用例&#xff0c;能够很方便的将测试数据和测试用例执行的逻辑进行分离。接下来和大家&#xff0c;手把手撸出一个ddt。 DDT的实现原理 首先我们…

MUR80120PT-ASEMI快恢复二极管MUR80120PT

编辑-Z MUR80120PT在TO-247封装里采用的2个芯片&#xff0c;其尺寸都是140MIL&#xff0c;是一款高耐压大电流快恢复二极管。MUR80120PT的浪涌电流Ifsm为600A&#xff0c;漏电流(Ir)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。MUR80120PT采用抗冲击硅芯片材质&…

DJ5-4 MAC、ARP

目录 一、链路层寻址地址 1、MAC 地址分配 2、MAC 地址识别 二、ARP 地址解析协议 1、ARP 地址解析协议 2、ARP&#xff1a;两个主机位于同一个局域网 3、ARP&#xff1a;发送数据报到子网以外 4、ARP 自举 5、ARP 攻击 一、链路层寻址地址 每个节点有网络层地址和链…

模拟电路系列分享-静态工作点

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要介绍静态工作点及耦合 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 要想让晶体管对输入电压信号进行有效的放大&#xff0c;必须解…

win10安装配置PostgreSQL

win10安装配置PostgreSQL 1 下载安装PostgreSQL ①进入官网https://www.postgresql.org/&#xff0c;点击页面中心处的download 也可以直接跳过下面的步骤(下面的步骤主要是为了帮助大家了解一般外国软件是如何从官网进入下载页面)&#xff0c;直接进入下载页面&#xff0c;链…

网络安全是个好的专业吗?高考志愿可以选择该专业吗?

首先说说关于学校和就业的问题&#xff0c;提到国内网络安全专业比较好的学校&#xff0c;“四邮四电”&#xff08;北邮、南邮、西邮、重邮、电子科大、西安电子科大、桂林电子科大、杭州电子科大&#xff09;必须拥有姓名。 而从现在的就业形势看&#xff0c;网络安全专业其…

SuperMap GIS基础产品三维GIS FAQ集锦(3)

SuperMap GIS基础产品三维GIS FAQ集锦&#xff08;3&#xff09; 【WebGL】如何批量管理entity图标&#xff0c;同时控制多个图标的显示和隐藏&#xff1f; 【解决办法】使用实体集合CustomDataSource进行管理&#xff0c;将实体按类别分类&#xff0c;分别添加到不同的实体集…

数字 IC 设计职位经典笔/面试题(一)

共100道经典笔试、面试题目&#xff08;文末可全领&#xff09; 什么是同步逻辑和异步逻辑&#xff1f; 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。同步时序逻辑电路的特点&#xff1a;各触发器的时钟端全部连接在一起&#xff0c;并接在…

NAPT之NAT地址池、NAPT之easy-ip、NAT-Server

NAPT之NAT地址池 拓扑 需求 实现企业内网主机&#xff08;PC1-PC4&#xff09;访问公网网站服务器&#xff08;Server1&#xff09; 配置步骤 第一步&#xff1a;给PC1-PC4/Server1配置接口IP地址&#xff0c;掩码&#xff0c;网关 第二步&#xff1a;R1配置默认路由 -边界…

【MySql】用户管理——用户管理|权限管理

文章目录 用户管理用户信息创建用户删除用户修改用户密码 数据库的权限给用户授权回收权限 用户管理 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 比如张三只能操作mytest这个数据库&#xff0c;李四只能操作msg这个…