代码随想录算法训练营第21天—回溯算法01 | ● 理论基础 ● *77. 组合

理论基础

  • 回溯是一种纯暴力搜索的方法,它和递归相辅相成,通常是执行完递归之后紧接着执行回溯
  • 相较于以往使用的for循环暴力搜索,回溯能解决更为复杂的问题,如以下的应用场景
  • 应用场景
    • 组合问题
      • 如一个集合{1,2,3,4},找出长度为2的组合
    • 排列问题
      • 相较于组合,排列是有顺序的,如{1,2}只有一种组合,但是有两种排列
    • 切割问题
      • 给一个字符串,给一个要求,求得怎么切割满足要求
    • 子集问题
      • 给一个集合,求它的子集
    • 棋盘问题
      • 如N皇后和解数独等
  • 回溯法的思维结构——树型结构
    • 宽度代表集合的大小
    • 深度代表递归的深度
    • 回溯法思维结构
# 回溯编程模板
def backtracking(形参): # 返回值通常为空if (终止条件):存放结果returnfor (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)):处理节点backtracking(路径,选择列表) # 递归回溯,撤销处理结果

*77. 组合

题目链接/文章讲解:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html
视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv
剪枝操作:https://www.bilibili.com/video/BV1wi4y157er

  • 考点
    • 回溯
  • 我的思路
    • 思路不到位
  • 视频讲解关键点总结
    • 回溯(递归)三要素
      • 形参:当前值,上限值,组合大小,单个组合变量,总组合结果变量;返回值为空
      • 退出条件:单个组合变量的大小等于组合大小,此时将单个组合变量加入总组合结果变量,并返回
      • 回溯逻辑
        • 不断地在范围内循环递归求取单个组合变量
        • 循环范围为当前值到上限值,每轮循环里:
          • 将当前值加入单个组合变量
          • 将当前值+1并递归
          • 执行回溯,即把单个组合变量里的最后一个值弹出,之后继续下一轮循环
      • 剪枝优化
        • 回溯题常常可以在循环范围上做优化
        • 本题可以把循环上限设置为上限值-(目标组合大小-当前组合大小)+2,+2是因为range函数在遍历时不包括右边界,所以要留出空余
  • 我的思路的问题
    • 无思路
  • 代码书写问题
    • 当想result变量添加单个组合变量时,要利用切片操作创建一个单个组合变量的副本并将该副本加入result,这是因为直接加入将仅仅把引用传入到result里,后续的改动将导致result里的同步改动
  • 可执行代码
class Solution:def backtracking(self, cur, n, k, single_set, result):if len(single_set) == k:result.append(single_set[:])returnfor i in range(cur, n - (k - len(single_set)) + 2):single_set.append(i)self.backtracking(i + 1, n, k, single_set, result)single_set.pop()def combine(self, n: int, k: int) -> List[List[int]]:result = []self.backtracking(1, n, k, [], result)return result

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

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

相关文章

MySQL数据库调优之 explain的学习

性能分析工具的使用 在数据库调优中,目标就是响应时间更快,吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮助快速找到调优的思路与方式。 1.数据库服务器的优化步骤 整个流程分为观察(Show status)和行动(Action) 两个部分。字母S的部分代表观察…

基于springboot+vue的美发门店管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

JS基础之JSON对象

JS基础之JSON对象 目录 JS基础之JSON对象对象转JSON字符串JSON转JS对象 对象转JSON字符串 JSON.stringify(value,replacer,space) value:要转换的JS对象 replacer:(可选)用于过滤和转换结果的函数或数组 space:(可选)指定缩进量 // 创建JS对象 let date {name:"张三…

信息安全工程师 软考回顾(一)

🐳概述 图源:文心一言 信息安全证书已经考了一年有余,尽管我目前没有从业安全的打算,况且自己的实践能力与从业标准依然有所差距,但其中的内容也值得再温习一遍~🥝🥝 另外,如果你对…

【蓝桥杯单片机入门记录】静态数码管

目录 一、数码管概述 (1)认识数码管 (2)数码管的工作原理 (3)LED数码管驱动方式-静态显示 二、数码管电路图 三、静态数码管显示例程 (1)例程1:数码管显示某一位&a…

C语言------操作符的巧妙使用

1.计算一个数字二进制补码里面1的个数 (1)方法一 根据这个10进制的整数,对这个数进行%10,/10不断地进行下去, %10得到最后一位,/10得到舍去最后一位之后剩余的数; 同理得到:二进…

【PX4学习笔记】07.PX4框架学习以及PX4中的PID

目录 文章目录 目录无人机实现飞行的控制流程PX4固件框架学习具体框架(总体)具体框架(boards)具体框架(build)具体框架(SRC)具体模块数据之间的关系 PX4中的PID代码体现uORB 其他QGC…

基础数据结构与相关C++ STL容器

文章目录 数组arrayvector 栈和队列dequestackqueue 堆heappriority_queue 链表listforward_list 树setmapmultisetmultimap 哈希表unordered_setunordered_mapunordered_multisetunordered_multimap 图 数组 array 不开口的连续线性空间,支持随机访问。 array是…

【xss跨站漏洞】xss漏洞利用工具beef的安装

安装环境 阿里云服务器,centos8.2系统,docker docker安装 前提用root用户 安装docker yum install docker 重启docker systemctl restart docker beef安装 安装beef docker pull janes/beef 绑定到3000端口 docker run --rm -p 3000:3000 janes/beef …

HTTP与HTTPS-HTTPS 的应用数据是如何保证完整性的?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTPS 的应用数据是如何保证完整性的? TLS 在实现上分为握手协议和记录协议两层 TLS 握手协议就是我们前面说的 TLS 四次握手的过程,负责协商加密算法和生成对称密钥,后续用此密…

【CVE-2024-21626】容器逃逸漏洞修复

哈喽大家好,我是咸鱼。 好久不见,最近有一个很火的 CVE——runc 容器逃逸漏洞。年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复。 因为今天咸鱼才开工,所以文章也就拖到了现在 😃 漏洞介绍 简单来讲&#xf…

MongoDB学习笔记

1. 写在前面 最近工作用到了Mongodb,虽然有了gpt,对于这种数据库操作的代码基本上不用自己费多大功夫,但对于知识本身,还是想借机会系统学习下Mongodb的,原因是之前接触数据库一直都是mysql,oracle等关系型…