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

回溯理论基础

回溯和递归是相辅相成的,只要有递归就有回溯(执行完一次递归就自动回溯到上一层)

回溯的效率

回溯不是一个高效的算法,而是一个纯暴力的过程

有些问题没有更好的解法,只能使用暴力搜索,这时就可以使用回溯法。包括以下问题:

1、组合问题

2、切割问题

3、子集问题

4、排列问题

5、棋盘问题(N皇后、解数独等)

如何理解回溯法

回溯法解决的问题都可以抽象为树形结构(N叉树)

回溯法的模板

void backtracking( 参数 ){// 终止条件if( 终止条件 ){收集结果(通常在叶子节点收集结果)return;}// 单层逻辑(通常为一个for循环,每次循环都继续递归)for(集合元素集){// 处理节点的操作// 递归// 回溯(还原,撤销对节点的操作)}
}

回溯三部曲:

1、确定递归函数的参数与返回值:返回值一般是void

2、确定递归的终止条件

3、确定单层递归的逻辑

 77.组合

思考了挺久,最后按模板做出来了(开心)

剪枝操作挺难想明白的

回溯三部曲:

· 参数:

        vector<vector<int>> ans:存放最终结果的全局变量

        vector<int> cur:当前路径下的组合(也可以设置为全局变量)

        int num:当前已经完成搜索的值,本次递归中从num + 1开始搜索

        int& k,int& n:题意中的k与n

· 终止条件:组合中的元素个数等于k,说明完成组合,将结果进行保存并返回

· 单层逻辑:

        节点操作:当前组合(cur)中添加当前值(i)

        递归:i已经完成操作,传入i+1进行递归

        回溯:i在该位置的所有组合已经收集完成,将i弹出当前组合

· 剪枝条件:

        原循环终止条件:i <= n;

        剪枝后的终止条件: i <= n - (k - cur.size()) + 1

        剪枝条件即:n - i + 1 >= k - size

        · n - i + 1代表当前序列中还剩下的元素个数(+1代表包括了当前节点)
        · k - size代表组合中还需要几个元素
        · 所以整个剪枝的含义为:当前序列中剩余的元素需要大于等于组合中还缺的元素个数

vector<vector<int>> ans;void backtracking(int num, int& k, int& n, vector<int> cur) {// 终止条件:数组长度为kif (cur.size() == k) {// 保存结果ans.push_back(cur);return;}for (int i = num + 1; i <= n - (k - cur.size()) + 1; ++i) {// 进行节点操作cur.push_back(i);// 递归backtracking(i, k, n, cur);// 还原节点操作(回溯)cur.pop_back();}
}vector<vector<int>> combine(int n, int k) { backtracking(0, k, n, {});return ans;
}

 

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

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

相关文章

【LeetCode每日一题】2381. 字母移位 II2406. 将区间分为最少组数 (差分数组)

差分数组案例 2381. 字母移位 II 给你一个小写英文字母组成的字符串 s 和一个二维整数数组 shifts &#xff0c;其中 shifts[i] [starti, endi, directioni] 。对于每个 i &#xff0c;将 s 中从下标 starti 到下标 endi &#xff08;两者都包含&#xff09;所有字符都进行移…

ReactNative实现的横向滑动条

OK&#xff0c;我们先看下效果图 注意使用到了两个库 1.react-native-linear-gradient 2.react-native-gesture-handler ok&#xff0c;我们看下面的代码 import {Image, TouchableWithoutFeedback, StyleSheet, View} from react-native; import LinearGradient from reac…

Linux---信号

前言 到饭点了&#xff0c;我点了一份外卖&#xff0c;然后又开了一把网游&#xff0c;这个时候&#xff0c;我在打游戏的过程中&#xff0c;我始终记得外卖小哥会随时给我打电话&#xff0c;通知我我去取外卖&#xff0c;这个时候游戏还没有结束。我在打游戏的过程中需要把外…

Docker 第十二章 : Docker 三剑客之 Swarm (节点管理命令)

第十二章 : Docker 三剑客之 Swarm (节点管理命令) 本章知识点: 本文介绍了Docker三剑客之Swarm的节点管理与命令。Swarm是Docker集群管理工具,允许用户轻松部署和管理容器化的应用程序。通过节点管理和命令,用户可以配置Swarm集群,包括添加、删除和更新节点,以及执行…

考研中常见的算法-逆置

元素逆置 概述&#xff1a;其实就是将 第一个元素和最后一个元素交换&#xff0c;第二个元素和倒数第二个元素交换&#xff0c;依次到中间位置。用途&#xff1a;可用于数组的移动&#xff0c;字符串反转&#xff0c;链表反转操作&#xff0c;栈和队列反转等操作。 逆置图解 …

<网络安全>《16 网络安全隔离与信息单向导入系统》

1 概念 网络安全隔离与信息单向导入系统解决了从外网向内网、低密级环境向高密级环境单向传输数据的问题。系统利用光单向传输的特性构建了一条安全、单向的传输通道&#xff0c;实现了外网到内网的数据传输&#xff08;低密级到高密级的传输&#xff09;&#xff0c;又能完全…

vulhub中Apache APISIX 默认密钥漏洞复现(CVE-2020-13945)

Apache APISIX是一个高性能API网关。在用户未指定管理员Token或使用了默认配置文件的情况下&#xff0c;Apache APISIX将使用默认的管理员Token edd1c9f034335f136f87ad84b625c8f1&#xff0c;攻击者利用这个Token可以访问到管理员接口&#xff0c;进而通过script参数来插入任意…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Menu组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Menu组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Menu组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间…

Day42 474一和零 完全背包理论基础 518零钱兑换II

474 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;s…

leetcode142 环形链表 II

文章目录 1. 解法&#xff1a;快慢指针2. 原题 [142. 环形链表 II](https://leetcode.cn/problems/linked-list-cycle-ii/) 1. 解法&#xff1a;快慢指针 定义两个指针fast和slow&#xff0c;同时从链表头出发&#xff0c;fast每次走两步&#xff0c;slow每次走1步&#xff0c…

第一个Linux 的.c 程序?

用vim 编辑器 来写c 1. 打开终端 首先&#xff0c;打开终端。你可以通过按下Ctrl Alt T 组合键或从应用程序菜单中选择终端。 2. 使用vim创建C程序 在终端中&#xff0c;运行以下命令以使用vim创建一个C程序文件。假设我们将文件命名为hello.c&#xff1a; vim hello.c …

深度学习本科课程 实验4 卷积神经网络

二维卷积实验 1.1 任务内容 手写二维卷积的实现&#xff0c;并在至少一个数据集上进行实验&#xff0c;从训练时间、预测精 度、Loss变化等角度分析实验结果&#xff08;最好使用图表展示&#xff09;&#xff08;只用循环几轮即可&#xff09;使用torch.nn实现二维卷积&…

ShardingSphere 5.x 系列【5】Spring Boot 3.1 集成Sharding Sphere-JDBC并实现读写分离

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 使用限制3. 案例演示3.…

[Angular 基础] - 数据绑定(databinding)

[Angular 基础] - 数据绑定(databinding) 上篇笔记&#xff0c;关于 Angular 的渲染过程及组件的创建&简单学习&#xff1a;[Angular 基础] - Angular 渲染过程 & 组件的创建 Angular 之中的 databinding 是一个相对而言更加复杂&#xff0c;以及我个人觉得相对而言比…

算法笔记刷题日记——3.简单入门模拟 3.1简单模拟

刷题日记 3.1 简单模拟 此类题型根据题目描述进行代码的编写&#xff0c;考察代码能力&#xff0c;刷题记录如下&#xff1a; B1001 B1032 B1016 B1026 B1046 B1008 B1012 B1018 A1042 A1046 A1065 B1010 A1002 A1009 错题记录 B1008 数组元素循环右移问题 一个数组_A_中存有…

[机缘参悟-145] :一个软件架构师对佛学的理解 -9- 修行的目标和层次:净心、智慧和解脱

目录 前言&#xff1a; 第一层次&#xff08;小乘&#xff09;&#xff1a;净心&#xff0c;摆脱痛苦和烦扰&#xff0c;进入平静和安宁 1.1 什么是净心 1.2 如何达到净心的状态 1.3 "常乐我净" 第二层次&#xff08;中乘&#xff09;&#xff1a;智慧&#xf…

【Spring连载】使用Spring Data访问Redis(十三)----支持类Support Classes

【Spring连载】使用Spring Data访问Redis&#xff08;十三&#xff09;----支持类Support Classes org.springframework.data.redis.support包提供了各种可重复使用的组件&#xff0c;这些组件依赖Redis作为后端存储。目前&#xff0c;该包包含Redis之上的各种基于JDK的接口实现…

SpringMVC精简知识点

SpringMVC 数据格式化基本数据类型和字符串自动转换特殊数据类型和字符串自动转换 验证及国际化应用实例注意事项和使用细节注解的结合使用数据类型转换校验核心类-DatBinder取消某个属性的绑定中文乱码解决处理json和HttpMessageConverter<T>作业布置SpringMVC文件上传自…

day19 初始HTML

什么是HTML HTML&#xff08;Hyper Text Markup Language&#xff09;超文本标记语言 超文本包括&#xff1a;文字、图片、音频、视频、动画等 HTML5&#xff0c;提供了一些新的元素和一些有趣的新特性&#xff0c;同时也建立了一些新的规则。这些元素、特性和规则的建立&…

【Linux】进程间通信 --管道通信

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 进程间通信原理1. 匿名管道1.1 通信原理1.2 接口介绍 2. 命名管道2.1 接口介绍 3. 共享内存3.1 通信原理3.2 接口介绍 0. 进…