代码随想录算法训练营Day24|回溯算法理论基础、第77题. 组合

目录

回溯算法理论基础

理论基础

回溯法解决的问题

回溯法理解

回溯模板

第77题. 组合

前言

算法实现

剪枝优化

总结


回溯算法理论基础

理论基础

        在二叉树中已经提到了回溯的概念,回溯是递归的副产品,也叫回溯搜索法,是一种搜索方式。回溯本身并不是高效的算法,因为回溯的本质就是穷举,穷举所有肯呢个,然后选出符合我们要求的答案,与暴力方式类似。

        如果想要让回溯法高效一些,可以加一些剪枝的操作,但是回溯穷举的本质没有改变。因此回溯法的效率并不高,但是在有些问题的处理上,回溯法是不得已的选择,因为对于有些问题,即便是暴力法都无法轻易解决。

回溯法解决的问题

        回溯法一般可以解决如下几种问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等

回溯法理解

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

回溯模板

        代码随想录中给出了回溯算法的大致模板,依照递归三部曲同样给出回溯三部曲

  • 回溯函数模板返回值以及参数

        在回溯算法中,我们习惯给函数起名字为backtracking;

        回溯算法中函数返回值一般为void。

        对于回溯函数的参数,一般是先写回溯函数的逻辑,然后需要什么参数,就填什么参数。

void backtracking(参数)
  • 回溯函数终止条件

        通过二叉树章节的学习,我们已经知道二叉树的递归需要有终止条件,所以回溯也要有终止条件。一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,就可以结束本层递归。

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

        回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成了树的深度。

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

        for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

可以大致理解为for循环就是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树遍历完了。一般来说,搜索叶子节点就是找的其中一个结果了。

        回溯算法模板框架如下:

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

第77题. 组合

题目链接

文章链接

前言

        本题要返回1~n中所有可能的k个数的组合,本题的直接想法是利用for循环进行遍历,当k为2的时候两次for循环,但是若当k为50时,则要嵌套50层,写起来较为复杂。使用回溯法递归来解决嵌套层数的问题。

        递归来做叠层嵌套,每一次的递归中嵌套一个for循环,那么递归就可以用于解决多次嵌套的问题。

算法实现

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startIndex){if (path.size() == k){result.push_back(path);return;}for (int i = startIndex; i <= n; i++){path.push_back(i); //处理节点backtracking(n, k, i + 1); //递归path.pop_back(); //回溯,撤销处理的节点}}
public:vector<vector<int>> combine(int n, int k) {result.clear();path.clear();backtracking(n, k, 1);return result;}
};

        backtracking(递归函数)通过不断调用自己一直往深处遍历,总会遇到叶子节点,遇到叶子节点就要返回。backtracking下面就是回溯的操作了,撤销本次处理的结果。

剪枝优化

class Solution {
private:vector<vector<int>> result;vector<int> path;void bathtracking(int n, int k, int startIndex){if (path.size() == k){result.push_back(path);return;}for (int i = startIndex; i <= n - (k - path.size()) + 1; i++){ //剪枝优化path.push_back(i); //处理节点bathtracking(n, k, i + 1); //递归path.pop_back(); //回溯,撤销处理的节点}}
public:vector<vector<int>> combine(int n, int k) {result.clear();path.clear();bathtracking(n, k, 1);return result;}
};

        优化的地方在于递归遍历循环的终止条件。如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了

总结

        今天初步系统认识了回溯算法的理论和应用,对递归和回溯的理解有了更加深入的认识。

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

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

相关文章

linux磁盘清理_docker/overlay2爆满

问题&#xff1a;无意间发现linux服务器登陆有问题&#xff0c;使用df命令发现目录满了。 1. 确定哪里占用了大量内存。 cd / du -sh * | sort -rh经过一段时间后&#xff0c;显示如下&#xff1a; // 474G home // 230G var // 40G usr // 10G snap // --- 根据实际情…

C++_命令行操作

命令行操作 介绍第一步编译 源码第二部 找到exe 可执行文件第三步看图操作代码测试源码测试结果 介绍 本文介绍命令行操作 1.argc 表示当前输入 参数个数 2.argv 表示当前输入 字符串内容 第一步编译 源码 #include<iostream> #include<string>using namespace st…

Spring Security 6.x 系列(15)—— 会话管理之源码分析

一、前言 在上篇 Spring Security 6.x 系列(13)—— 会话管理之会话概念及常用配置 Spring Security 6.x 系列(14)—— 会话管理之会话固定攻击防护及Session共享 中了清晰了协议和会话的概念、对 Spring Security 中的常用会话配置进行了说明,并了解会话固定攻击防护…

React Native 桥接原生常量

一、编写并注册原生常量方法 在 SmallDaysAppModule 这个模块中有一个方法 getConstans &#xff0c;重载这个方法就可将自定义的常量返回&#xff0c;系统会自行调用该方法并返回定义的常量将其直接注入到 JS 层&#xff0c;在 JS 层直接获取即可。 二、JS 层获取原生常量&am…

el-table 个体行绑定点击事件时 表格中有el-radio和el-checkbox 点击触发两次事件处理方法

问题描述 在element的table中 使用radio或者checkbox 的单击事件,会导致radio或者checkbox的单击事件触发两次 解决办法 <el-table :data"tableData" style"width: 100%" max-height"500" :header-cell-style"tableHeaderCellStyle&q…

chatglm3的api调用

conda activate chatglm3 cd openai_api_demo python openai_api.py 启动ok&#xff0c;然后内网映射后 anaconda启动jupyter !pip install openai1.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/ """ This script is an example of using the OpenAI …

Halcon 3D-Transformation 相关算子(一)

(1) hom_mat3d_identity( : : : HomMat3DIdentity) 功能&#xff1a;生成三维齐次变换矩阵。 控制输出参数&#xff1a;HomMat3DIdentity&#xff1a;变换矩阵。 (2) create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewO…

esm中使用__dirname与__filename

ESM中的__dirname ; __filename import.meta.url import.meta 包含当前模块的一些信息&#xff0c;其中 import.meta.url 表示当前模块的 file: 绝对路径&#xff0c;拿到这个绝对路径我们就可以配合其他 API 来实现 __filename 和 __dirname。 console.log(import.meta.url…

离线安装docker和docker-compose

1.下载 docker Index of linux/static/stable/x86_64/ docker-compose Overview of installing Docker Compose | Docker Docs 2.docker /etc/systemd/system/docker.service [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.…

6.OpenResty系列之深入理解(二)

1. 日志输出 vim /usr/local/openresty/nginx/conf/nginx.conf默认配置如下 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;http {#log_format main $remote_addr - $remote_user [$time…

回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SO-LSTM蛇群算法优化…

docker镜像的生成过程

镜像的生成过程 Docker镜像的构建过程&#xff0c;大量应用了镜像间的父子关系。即下层镜像是作为上层镜像的父镜像出现的&#xff0c;下层镜像是作为上层镜像的输入出现。上层镜像是在下层镜像的基础之上变化而来。 FROM centos:7 FROM指令是Dockerfile中唯一不可缺少的命令&a…

RocketMq直接上手(火箭班)

Apache RocketMQ官方文档&#xff1a;https://rocketmq.apache.org/zh/docs/bestPractice/06FAQ/&#xff0c;这里面涵盖了所有的基本知识、各种搭建环境、基础代码测试…还有各种问题总结&#xff0c;很值得自主学习。 1.配置依赖&#xff1a;pom.xml文件 可以只截取maven仓库…

3.3 IMAGE BLUR: A MORE COMPLEX KERNEL

我们研究了vecAddkernel和colorToGreyscaleConversion&#xff0c;其中每个线程只对一个数组元素执行少量算术运算。这些内核很好地服务于其目的&#xff1a;说明基本的CUDA C程序结构和数据并行执行概念。在这一点上&#xff0c;读者应该问一个显而易见的问题——所有CUDA线程…

C++类和对象(万字超详细讲解!!!)

文章目录 前言1.面向过程和面向对象区别2.类的基本概念2.1 类的引入2.2 类的定义2.3 类成员变量的命名规则2.4 类的访问限定符2.5 类的封装2.6 类的作用域2.7 类的实例化 3.类对象模型3.1 如何计算类对象的大小3.2 对齐规则 4.this指针4.1 this指针的引出4.2 this指针的特性4.3…

Android App打包加固后的APK无法安装问题

最近开发的一个应用要上架&#xff0c;正常流程打完包后去加固&#xff0c;由于以前一直用的是360的加固助手&#xff0c;这里开始也是选择用它。 使用360加固&#xff1a; 问题一、开始出现的问题是说应用未签名无法加固&#xff0c;我明明是签名后打的包&#xff0c;怎么会…

2023全球年度安全漏洞TOP 10

数字化转型步伐不断加快&#xff0c;社会各行业迎来了许多发展机遇&#xff0c;但与此同时面临着日益复杂的数据安全和网络安全威胁。其中&#xff0c;安全漏洞数量持续增长更是成为了各行各业不可忽视的挑战&#xff0c;尤其是在工业、金融、交通、国防、医疗和信息技术等领域…

K8S集群调度(2)

schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配&#xff0c;不走调度策略。node01. nodeSelector: 根据节点的标签选择&#xff0c;会走调度的算法。 只要是走调度算法&#xff0c;在不满足预算策略的情况下&#xff0c;所有po…

MyBatisPlus学习笔记一

1、简介 MyBatisPlus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatisMyBatisMyBatis的的基础上只做增强不做改变&#xff0c;为简化开发&#xff0c;提高效率而生。 官网&#xff1a;MyBatis-Plus mybatisplus通过扫描实体类&#xff0c;并基于…

2-归并排序

算法&#xff1a;归并排序 思想&#xff1a;分治法【问题分解&#xff0c;归并排序递归解决&#xff0c;合并解】 实现&#xff1a;将数组通过递归方式自顶向下的分解至最小单元&#xff0c;再自底向上进行合并&#xff0c;以此实现排序 时间复杂度&#xff1a; Θ ( n l g n )…