回溯算法章末总结

news2024/11/23 21:34:53

在这里插入图片描述

  1. 组合问题的特点
    (1)ab=ba 选中a之后,就不再选了
    (2)找出所有的组合 (长度可以不相等)

  2. 组合问题模板
    在这里插入图片描述

  3. 做回溯题步骤
    在这里插入图片描述

    (0)判断问题类型
    (1)树状图
    (2)递归三部曲
    (3)剪枝条件

  4. 组合问题中的纵横剪枝 ----> 216.组合总和III
    ==有图==

  5. 去重
    (1)横向去重
    在这里插入图片描述
    (2)set横向去重

在这里插入图片描述

代码

 public void findSubsequencesBT(int[] nums,int startIndex) {

        HashSet<Integer> set = new HashSet<>();
        for (int i = startIndex; i < nums.length; i++) {
            // 剪枝
            if (findSubsequencesPath.size()>0&&findSubsequencesPath.get(findSubsequencesPath.size()-1)[0]>nums[i]){
                continue;
            }
            // 此处不能是==,只能是>= 为空时也要判断去重
            if ((findSubsequencesPath.size()==0||findSubsequencesPath.size()>0&&findSubsequencesPath.get(findSubsequencesPath.size()-1)[0]<=nums[i])&&set.contains(nums[i])){
                continue;
            }
            //三件套
            //using[i]=true;
            findSubsequencesPath.add(new int[]{nums[i],i});
            set.add(nums[i]);
            if (findSubsequencesPath.size()>=2){
                ArrayList<Integer> temp = new ArrayList<>();
                for (int j = 0; j <findSubsequencesPath.size() ; j++) {
                    temp.add(findSubsequencesPath.get(j)[0]);
                }
                ires.add(temp);
            }
            findSubsequencesBT(nums,i+1);

            findSubsequencesPath.remove(findSubsequencesPath.size()-1);
           // set 不用回溯,每层一个
            // using[i]=false;
        }
    }

关键
在这里插入图片描述

  1. 分割递归终止条件
    分割常用的递归出口
    (1)startIndex==数组长度
    缺点: 如果是分割有段数要求,例如ip,可能分割很多段后才到递归出口,1.1.1.1.1.1.1 再判断,白白浪费性能。
    改进:当已经分割三段时,第四段直接判断,这样可以剪掉部分,但是最后还是会一个一个试
   public void restoreIpAddressesBT(String s,int startIndex) {
        if (startIndex==s.length()){
            if (restoreIpAddressesPath.size()==4){
                StringBuilder sb = new StringBuilder();
                for (String s1 : restoreIpAddressesPath) {
                    sb.append(s1+".");
                }
                sb.delete(sb.length()-1,sb.length());
                slist.add(sb.toString());
            }
            return;
        }

        for (int i = startIndex; i <s.length() ; i++) {
            String substring = s.substring(startIndex, i + 1);
            // 剪枝
               // 如果已经有3个了,直接看剩下的能不能凑成第四个就行
            if (restoreIpAddressesPath.size()==3&&valIsValid(s.substring(startIndex))==-1){
                return;  // 本层全不能用
            }
            if (valIsValid(substring)==-1){
                continue;
            }
            restoreIpAddressesPath.add(substring);
           restoreIpAddressesBT(s,i+1);
            restoreIpAddressesPath.remove(restoreIpAddressesPath.size()-1);
        }
    }

(2)如果有段数要求,直接用段数作为剪枝条件

  if (restoreIpAddressesPath.size()==4){
            if (startIndex==s.length()){
                StringBuilder sb = new StringBuilder();
                for (String s1 : restoreIpAddressesPath) {
                    sb.append(s1+".");
                }
                sb.delete(sb.length()-1,sb.length());
                slist.add(sb.toString());
            }
            return;
        }

在这里插入图片描述
这样只要到段数,就会判断,不会再 1.1.1.1.1.1.1这样分

题型

组合问题

每条从根出发的子路径是一个结果

  1. 传统组合问题 每一条子路径都是一种组合 —>● 77. 组合● 216.组合总和III
  2. 从筐中取球类型–>● 17.电话号码的字母组合
  3. 组合,元素不重,元素可重复取 39. 组合总和
  4. 组合,元素重复,结果不重,横向去重–> 40.组合总和II

子集问题

  1. 组合问题之子集问题,找到所有从根节点出发的子路径,包含【】
    ---->78.子集
  2. 组合问题之递增序列,本质是子集问题,使用set去重,注意第一层时path可能为空 491.递增子序列

分割

每条路径是一个结果
5. 标准分割 --> 131.分割回文串 ● 93.复原IP地址

排列

  1. 排列,借助used数组 46.全排列 47.全排列 II

递归树

  1. 传统组合
    在这里插入图片描述

  2. 筐中取球
    在这里插入图片描述

  3. 组合,每个元素可重复
    在这里插入图片描述

  4. 组合,元素重复,结果不重,横向去重
    在这里插入图片描述

  5. 标准分割
    在这里插入图片描述
    (2)分割模板

// 131.分割回文串 
 public void partitionBT(String s,int startIndex) {
        if (startIndex==s.length()){
            sres.add(new ArrayList<>(spath));
            return;
        }
        // 引擎
        for (int i = startIndex; i <s.length() ; i++) {
            // 剪枝
            if (!isPalindrome(s,i,startIndex)){

                return;
            }
            spath.add(s.substring(i, startIndex + 1));
            partitionBT(s,i+1);
            spath.remove(spath.size()-1);
            // 本层下一个
        }
    }

(3)不同之处
在这里插入图片描述
6. 子集问题
78.子集
(2)子集问题模板

 // 78. 子集
    public void subsetsBT(int[] nums,int startIndex) {
        // 找所有从根节点的子路径,为处理空置,先加入
        ires.add(new ArrayList<>(ipath));

        // 递归终止条件  直接使用循环终止

        // 循环引擎
        for (; startIndex <nums.length ; startIndex++) {
            // 剪枝 无

            //三件套
            ipath.add(nums[startIndex]);
            subsetsBT(nums,startIndex+1);
            ipath.remove(ipath.size()-1); //  删除的是startIndex
        }
    }

(3)不同之处
在这里插入图片描述
7. 递增序列问题

在这里插入图片描述

代码

 public void findSubsequencesBT(int[] nums,int startIndex) {

        HashSet<Integer> set = new HashSet<>();
        for (int i = startIndex; i < nums.length; i++) {
            // 剪枝
            if (findSubsequencesPath.size()>0&&findSubsequencesPath.get(findSubsequencesPath.size()-1)[0]>nums[i]){
                continue;
            }
            // 此处不能是==,只能是>= 为空时也要判断去重
            if ((findSubsequencesPath.size()==0||findSubsequencesPath.size()>0&&findSubsequencesPath.get(findSubsequencesPath.size()-1)[0]<=nums[i])&&set.contains(nums[i])){
                continue;
            }
            //三件套
            //using[i]=true;
            findSubsequencesPath.add(new int[]{nums[i],i});
            set.add(nums[i]);
            if (findSubsequencesPath.size()>=2){
                ArrayList<Integer> temp = new ArrayList<>();
                for (int j = 0; j <findSubsequencesPath.size() ; j++) {
                    temp.add(findSubsequencesPath.get(j)[0]);
                }
                ires.add(temp);
            }
            findSubsequencesBT(nums,i+1);

            findSubsequencesPath.remove(findSubsequencesPath.size()-1);
           // set 不用回溯,每层一个
            // using[i]=false;
        }
    }

关键
在这里插入图片描述
8. 排列

    public void permuteBT(int[] nums,boolean[] used) {
        if (ipath.size()==nums.length){
            ires.add(new ArrayList<>(ipath));
            return;
        }

        for (int i = 0; i <nums.length ; i++) {
            if (used[i]==true){
                continue;
            }
            // 剪枝

            // 三件套
            used[i]=true;
            ipath.add(nums[i]);
            permuteBT(nums,used);
            ipath.remove(ipath.size()-1);
            used[i]=false;
        }
    }

在这里插入图片描述

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

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

相关文章

【百度 JavaScript API v3.0】LocalSearch 位置检索、Autocomplete 结果提示

地名检索移动到指定坐标 需求 在输入框中搜索&#xff0c;在下拉列表中浮动&#xff0c;右侧出现高亮的列表集。选中之后移动到指定坐标。 技术点 官网地址&#xff1a; JavaScript API - 快速入门 | 百度地图API SDK 开发文档&#xff1a;百度地图JSAPI 3.0类参考 实现 …

Pillow图像处理(PIL.Image类的详细使用)

文章目录Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库&#xff08;PIL、Pillow、Scikit-image、Opencv&#xff09;Pillow 官方文档&#xff08;超详细&#xff0c;超推荐&#xff09;一、PIL库与Pillow库的区别二、Pillow库&#xff08;…

Vue3 目录结构

Vue3 目录结构 架构搭建 请确保你的电脑上成功安装 Node.js&#xff0c;本项目使用 Vite 构建工具&#xff0c;需要 Node.js 版本 > 12.0.0。 查看 Node.js 版本&#xff1a; node -v建议将 Node.js 升级到最新的稳定版本&#xff1a; 使用 nvm 安装最新稳定版 Node.js…

使用docker配置mysql主从复制

1.新建主服务器容器实例&#xff1a; docker run -p 3307:3306 --name mysql \ -v /docker/mysql/data:/var/lib/mysql \ -v /docker/mysql/conf:/etc/mysql/conf \ -v /docker/mysql/log:/var/log/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 设置容器卷之后&#xf…

Java网络编程之UDP和TCP套接字

文章目录一. 网络编程概述二. UDP网络编程1. UDP套接字2. UDP客户端回显服务器程序2.1 UDP回显服务器2.2 UDP客户端2.3 UDP实现查词典的服务器三. TCP网络编程1. TCP套接字2. TCP客户端回显服务器程序2.1 TCP回显服务器2.2 TCP客户端2.3 解决服务器无法同时出力多个客户端的问题…

牛客专访ChatGPT:2023校园招聘如何做?附校招趋势

春招在即&#xff0c;牛客作为新一代数智化校园招聘引领者&#xff0c;为大家采访了当下“顶流ChatGPT”&#xff0c;关于近几年校园招聘的变化及2023企业做校招的建议。以下&#xff0c;为“ChatGPT专访”实录。01. ChatGPT眼中近3年校园招聘的变化牛客&#xff1a;很高兴作为…

Unity Material详解

一、创建 二、属性 1.Shader:Unity内置了一些shader&#xff0c;用户自定义的shader也在这里出现. Edit: 可以编辑一些shader可编辑的内容&#xff0c;如一些属性. 2.Rendering Mode:渲染模式 Opaque-不透明-石头适用于所有的不透明的物体Cutout-镂空-破布透明度只有0%和100…

go语言环境配置 项目启动

一 安装go语言 go语言各个版本之间兼容性比较差。所以可能你需要安装固定的版本 1 安装最新版的go brew install go2 查看go可以安装的版本 brew search go3 安装指定版本的go brew install go1.134 查看安装的go语言的版本 go version5 查看go的安装路径 which go || w…

【软件测试】稳定性测试怎么做,这篇文章彻底讲透了~

稳定性对产品的重要性不言而喻。 而作为质量保障&#xff0c;在稳定性测试方面的探索也在不断演化。记得两年前我们做稳定性测试还是基于恒定的压力&#xff0c;7*24小时长时间运行&#xff0c;关注的指标无非是吞吐量TPS的抖动、响应时间的变化趋势&#xff0c;以及各种资源是…

《机器学习系统:设计和实现》读后感和一些思考

目录 计算图、编译器前端、编译器后端 计算图 计算图的作用 计算图的组成 静态计算图与动态计算图 编译器前端 IR中间表示 机器学习框架的中间表示 常见编译器前端优化方法 编译器后端 概述 通用硬件优化&#xff1a;算子拆分和算子融合 算子信息 数据精度和存储…

opencv访问图像(MAT)的属性

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

设计模式:装饰模式

1、装饰模式 1&#xff09;定义 动态&#xff08;组合&#xff09;地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码&减少子类个数&#xff09;。 2&#xff09;动机&…

Harbor安装部署实战详细手册

文章目录前言一、安装docker二、安装docker-compose1.下载2.赋权3.测试三、安装harbor1.下载2.解压3.修改配置文件4.部署5.配置开机自启动6.登录验证7.补充说明四、harbor使用问题1.docker login问题&#xff1a;Error response from daemon: Get https://: http: server gave …

Ubuntu 安装 Qt5.7.0

下载 地址&#xff1a;https://download.qt.io/https://download.qt.io/ 文件夹说明&#xff1a; snapshots&#xff1a;预览版&#xff0c;该文件夹中包含最新的测试版本。 online&#xff1a;在线安装包。 official_releases&#xff1a;最终发布版。 new_archive&#…

netcore构建webservice以及调用的完整流程

目录构建前置准备编写服务挂载服务处理SoapHeader调用添加服务调用服务补充内容构建 前置准备 框架版本要求&#xff1a;netcore3.1以上 引入nuget包 SoapCore 编写服务 1.编写服务接口 示例 using System.ServiceModel;namespace Services;[ServiceContract(Namespace &…

Elasticsearch 安装(二)

目录前言一、Linux 安装1、下载安装包⑴、选择需要的安装包⑵、下载解压到安装目录2、查看解压后目录结构3、启动 Elasticsearch⑴、正常启动流程⑵、启动过程遇到的问题①、启动报错②、创建运行 Elasticsearch 的用户&#xff0c;启动成功&#xff0c;但无法访问③、停止Elas…

【pytorch框架】对模型知识的基本了解

文章目录TensorBoard的使用1、TensorBoard启动&#xff1a;2、使用TensorBoard查看一张图片3、transforms的使用pytorch框架基础知识1 nn.module的使用2 nn.conv2d的使用3、池化(MaxPool2d)4 非线性激活5 线性层6 Sequential的使用7 损失函数与反向传播8 优化器9 对现有网络的使…

Flink X Hologres 构建企业级 Streaming Warehouse

摘要&#xff1a;本文整理自阿里云资深技术专家&#xff0c;阿里云 Hologres 负责人姜伟华&#xff08;果贝&#xff09;&#xff0c;在 FFA 实时湖仓专场的分享。本篇内容主要分为四个部分&#xff1a;实时数仓分层的技术需求阿里云一站式实时数仓 Hologres 介绍Flink x Holog…

30个题型+代码(冲刺2023蓝桥杯)

愿意的可以跟我一起刷&#xff0c;每个类型做1~5题 &#xff0c;4月前还可以回来系统复习 2月13日 ~ 3月28日&#xff0c;一共32天 一个月时间&#xff0c;0基础省三 --> 省二&#xff1b;基础好点的&#xff0c;省二 --> 省一 目录 &#x1f33c;前言 &#x1f33c…

1.1配置单区域OSPF

实验1:配置单区域OSPF[1] 1.实验目的 实现单区域OSPF的配置描述OSPF在多路访问网络中邻居关系建立的过程2.实验拓扑 单区域的OSPF实验拓扑如图1-2所示。 图1-2 配置单区域OSPF 3.实验步骤 IP地址的配置[2] R1的配置