【20230227】回溯算法小结

news2024/12/26 0:11:57

回溯法又叫回溯搜索法,是搜索的一种方式。

回溯法本质是穷举所有可能。如果想让回溯法高效一些,可以加一些剪枝操作。

回溯算法解决的经典问题:

  • 组合问题

  • 切割问题

  • 子集问题

  • 排列问题

  • 棋盘问题

如何去理解回溯法?

回溯法解决的问题都可以抽象为树形结构,回溯法解决的是在集合中递归查找子集,集合的大小构成树的宽度,递归的深度构成树的深度。

递归就要有终止条件,所以必然是一颗高度有限的树(N叉树)

回溯法模板

回溯三部曲

  • 回溯函数模板返回值以及参数(一般返回值都为void)

  • 回溯函数终止条件

if(终止条件){
    存放结果;
    return;
}
  • 回溯搜索的遍历过程

for(选择:本层集合中的元素(树中节点孩子的数量就是集合的大小)){
    处理节点;
    backtracking(路径,选择列表);//递归
    回溯,撤销处理结果
}

组合问题

组合

在for循环中,i的结束条件可以优化,即:

列表剩余元素个数n-i+1>=所需元素个数k-path.size(),i<=n-k+path.size()+1。

组合总和

无重复数

可重复取

组合总和II

有重复数

不可重复取

组合总和III

无重复数

不可重复取

组合总和IV

无重复数

可重复取,且有排列(动规问题)

组合总和III

电话号码的字组合

数字与字母的映射问题可以用map,也可以用一个二维数组;

将char型转为int型,用char-‘0’的方式。

组合总和

可以重复使用元素,所以startIndex直接等于i就行了,不能直接每次都从0开始(这是排列的情况,会有重复出现);

组合总和II

集合中出现了重复元素,如果用之前的常规做法,会出现下面重复的情况,因此需要去重工作。

组合总和IV

用回溯超时了,是动态规划问题。


切割问题

分割回文串

  1. 如何切割的问题--确定分割点,例如abcdef,切割一个a后,在bvdef中再去切割第二段

  1. 如何判断为回文串--写一个bool型函数,专门用来判断

注意:截取子字符串substr(n,m)表示从下标n开始取m个元素

复原IP地址

  1. 如何切割的问题,确定切割点,插入.号,用已经插入.号的数量来判断是否结束

  1. 如何判断是否为有效IP地址

注意一些细节问题:

string中插入 insert 擦除erase,因为已经插入.号,因此下一层递归开始应该在i+2处

除了只有一个0以外,以0开头的数字不合法;大于255不合法;

    bool isValid(string& s,int left,int right){
        if(left>right)  return false;
        if(s[left]=='0'&&left!=right) return false;
        int x=stoi(s.substr(left,right-left+1));
        if(x<=255)  return true;
        else return false;
    }

子集问题

子集 (不含重复元素)

子集问题是找树的所有节点,而组合和分割问题都是收集树的叶子节点。

每个节点都需要保存,所以先存,再判断终止条件。

子集II (含有重复元素)

在同一层中不可选取相同元素,属于树层去重。

其实树层去重可以不用used数组,直接排序后判断相邻的数是否相同就可以完成树层去重。

注意:去重都需要排序!!!

递增子序列

需要解决的问题:

  1. 去重问题,仍然是树层的去重,但是不能对数组进行排序了,于是用哈希表进行去重;

  1. 选取的是符合条件的每个节点,其实可以与之前的联系起来,相当于可以不用写终止条件;


排列问题

全排列(没有重复元素)

排列问题就不需要startIndex了,需要使用used数组,来确定该数字在path中已经被取过了。

全排列II(有重复元素)

使用used数组+哈希表进行树枝去重和数层去重。


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

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

相关文章

hadoop调优

hadoop调优 1 HDFS核心参数 1.1 NameNode内存生产配置 1.1.1 NameNode内存计算 每个文件块大概占用150byte&#xff0c;如果一台服务器128G&#xff0c;能存储的文件块如下 128 (G)* 1024(MB) * 1024(KB) * 1024(Byte) / 150 Byte 9.1 亿 1.1.2 Hadoop2.x 在Hadoop2.x中…

Linux--多线程(3)

目录1. POSIX信号量1.1 概念2. 基于环形队列的生产消费者模型2.1 环形队列的基本原理2.2 基本实现思想3. 多生产多消费1. POSIX信号量 1.1 概念 信号量本质是一个计数器&#xff0c;申请了信号量以后&#xff0c;可以达到预定临界资源的效果。 POSIX信号量和SystemV信号量相同…

【自动包装线标签打印翻转问题沟通】

最近纺丝自动包装线的标签打印机自动打印标签&#xff0c;是翻转状态。) 但是这个打印机它不是平放的&#xff0c;它是通过悬臂安装在半空的中的&#xff0c;是翻转的&#xff0c; 它的标签一个打在侧面&#xff0c;一个打在正前方&#xff0c;打印出来的样子是这样的。 是反…

全国媒体邀约怎么做?邀请媒体有哪些注意事项呢?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好好多企业或者机构都在参加外地的展览展会&#xff0c;活动会议&#xff0c;或者由于多种方面的考虑&#xff0c;会在公司总部以外的地方去做活动和发布会&#xff0c;在一个相对陌生的地方&#xff0c;不论是活动准备&#…

WebRTC → 多人通讯架构浅析

1、一对一通信模型一对一通信中&#xff0c;WebRTC会先尝试两个终端之间是否可以通过P2P直接进行通信&#xff0c;无法通信时会通过STUN/TURN服务器进行中转&#xff1b;其中STUN/TURN服务器的作用在不能直连时是中继服务器&#xff0c;通过该服务器进行端到端之间的数据中转&a…

数据挖掘多模块接口(二分类)python旗舰版

数据挖掘任务一般分为四大步骤&#xff1a;1、数据预处理2、特征选择3、模型训练与测试4、模型评估本文为四大步骤提供接口&#xff0c;使得能够快速进行一个数据挖掘多种任务中&#xff0c;常见的二分类任务。0. 导包0.1 忽略警告信息&#xff1a;import warnings warnings.fi…

【Java学习笔记】2.Java 开发环境配置

Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境。 window系统安装java 下载JDK 首先我们需要下载 java 开发工具包 JDK&#xff0c;下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/&#xff0c;在下载页面中根据自己的系统选…

企业寄件现代化管理教程

现代化企业为了跟上时代发展的步伐&#xff0c;在不断完善着管理制度&#xff0c;其中公司寄件管理&#xff0c;也是重要的一个模块。为了提高公司快递的寄件效率&#xff0c;以及节约寄件成本&#xff0c;实现快递寄件的规范化&#xff0c;越来越多的现代化企业&#xff0c;开…

ES linux 环境下安装问题集锦

1&#xff1a; 所有的环境配置安装完成后验证&#xff1a; curl -u elastic http://127.0.0.1:9400 输入密码&#xff1b;2&#xff1a;错误1&#xff1a;解决方法&#xff1a;配置连接的用户名与密码&#xff1b; 重启ES 错误2&#xff1a;[1]: max number of threads [2048] …

前端性能优化:浏览器的2种缓存方式,你了解吗?

在前端性能优化中&#xff0c;最重要的就是缓存&#xff0c;使用缓存可以极大的提升浏览器的响应速率。什么是缓存呢&#xff1f;当我们第一次访问某个网站时&#xff0c;浏览器会把网站中的图片等资源存储在电脑中&#xff0c;以备后续使用&#xff0c;第二次访问该网站时&…

c++继承机制

4-4继承&#xff08;带参构造&#xff09;_哔哩哔哩_bilibili 继承机制 4.1继承与派生的概念 继承 是指在已有类或称为基类的基础上创建新类&#xff0c;这个新类就是派生类。 单继承&#xff1a;由一个基类派生的类 多继承&#xff1a;由两个或多个基类派生的类 派生类的…

【Windows】【Linux】---- Java证书导入

问题&#xff1a; PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 无法找到请求目标的有效证书路径 一、Windows—java证书导入 1、下载证书到本地&#xff08;以下…

理解Transformer

Transformer总体框架&#xff1a; 1、Encoder Encoder由 6 层组成&#xff0c;每一层包括两个子层&#xff1a;第一层 multi-head self-attention 层&#xff08;8个heads&#xff09;&#xff0c;第二层是一个简单的全连接前馈网络。在每个子层后都接了一个残差连接以及归一化…

Linux命令行安装Oracle19c

安装 下载 从 Oracle官方下载地址 需要的版本&#xff0c;本次安装是在Linux上使用yum安装&#xff0c;因此下载的是RPM。另外&#xff0c;需要说明的是&#xff0c;Oracle加了锁的下载需要登录用户才能安装&#xff0c;而用户是可以免费注册的&#xff0c;这里不做过多说明。 …

JavaScript简述

JavaScript简述JavaScript简介JS用法JavaScript输出window.alert&#xff08;&#xff09;document.write&#xff08;&#xff09;innerHTML&#xff08;&#xff09;console.log&#xff08;&#xff09;JavaScript简介 JavaScript是脚本语言&#xff0c;可用于HTML和web。 …

Vue项目中引入高德地图步骤详解

高德地图API官网&#xff1a;高德开放平台 | 高德地图API。 目录 一、案例效果 二、开发准备 1. 注册高德开放平台账号 2. 创建应用添加 key 值 三、项目中使用地图组件 1. npm 获取高德地图 API 2.在项目中新建 MapContainer.vue 文件&#xff0c;用作地图组件。 3.在…

SpringBoot-运维篇

在运维实用篇中&#xff0c;是玩转配置&#xff0c;为开发实用篇中做各种技术的整合做好准备工作。与开发实用篇相比&#xff0c;运维实用篇的内容显得略微单薄&#xff0c;并且有部分知识模块在运维实用篇和开发实用篇中都要讲一部分&#xff0c;这些内容都后置到开发实用篇中…

python实现PCA降维画分类散点图并标出95%的置信区间

此代码以数据集鸢尾花为例&#xff0c;对其使用PCA降维后&#xff0c;绘制了三个类别的样本点和对应的置信圆&#xff08;即椭圆&#xff09;。先放效果图。 下面是完整代码&#xff1a; from matplotlib.patches import Ellipsedef plot_point_cov(points, nstd3, axNone, **…

Windows环境搭建Android开发环境-Android Studio/Git/JDK

Windows环境搭建Android开发环境-Android Studio/Git/JDK 因为休假回来后公司的开发环境由Ubuntu变为了Windows&#xff0c;所以需要重新配置一下开发环境。 工作多年第一次使用Windows环境进行开发工作&#xff0c;作次记录下来。 一、 Git安装 1.1git 标题软件下载 网址&…

CISA 告诉机构优先考虑什么以满足网络安全日志要求

随着联邦机构努力满足 2021 年发布的网络安全记录要求&#xff0c;政府的主要网络安全部门发布了一般指南&#xff0c;以帮助机构领导者优先考虑可能是昂贵且资源密集型实施的部分内容。 管理和预算办公室于 2021 年 8 月发布了一份备忘录&#xff0c;要求各机构创建和维护某些…