解题方式篇-回溯

news2024/12/23 10:41:15

回溯算法

1、简介

简介:回溯法也可以叫做回溯搜索法,它是一种搜索的方式。

  • 回溯是递归的副产品,只要有递归就会有回溯。
  • 回溯是一种暴力的搜索方式。

回溯法,一般可以解决如下几种问题:组合(无序)、排列(有序)

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等
    • 组合是不强调元素顺序的,排列是强调元素顺序
    • 例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{1, 2} 和 {2, 1} 就是两个集合了。

回溯模板:回溯过程可以抽象为一颗n叉树

  • 这颗抽象的树形结构中,每一个节点都是一个for循环,for循环的起始位置是从startIndex开始,然后遍历剩余元素

在这里插入图片描述

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

2、核心问题

🚀解题流程

  1. 确定递归函数的参数和返回值
  2. 确定递归的终止条件
  3. 确立单层递归的逻辑

🚀回溯问题

  1. 收集结果在哪?是叶子节点收集结果还是路径收集?-> return的位置和是否需要
  2. 去重在哪去重?树层还是树枝?相邻元素如何去重?不相邻元素如何去重?-> 相邻和hash
  3. 组合问题、子集问题、排列问题的区别在哪?
  4. 有序和无序的区别是什么?

3、例题

题目:给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案

  1. 确定参数ArrayList path存放单个组合、ArrayList result存放所有组合结果、nk确定组合和范围、startIndex确定下次搜索的起始位置
  2. 确定终止条件:单个组合path大小为k,收集结果
  3. 确立单层递归逻辑:for循环开始为startIndex,递归遍历,下一层起始位置为startIndex+1,弹出元素回溯。
public List<List<Integer>> combine(int n, int k) {
    //1.确定参数和返回值
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    int startIndex = 1;
    backtracking(result, path, n, k, startIndex);

    //返回结果
    return result;
}

public void backtracking(List<List<Integer>> result, List<Integer> path, int n, int k, int startIndex) {
    //2.确立递归终止条件
    if (k == path.size()) {
        result.add(new ArrayList<>(path));
        return;
    }

    //3.确立单层递归逻辑
    for (int i = startIndex; i <= n; i++) {
        path.add(i);
        backtracking(result, path, n, k, i + 1);
        path.remove(path.size() - 1);
    }
}

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

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

相关文章

Spring Boot 3.x.x Spring Security 6.x.x @PreAuthorize 失效

Spring Boot 3.x.x Spring Security 6.x.x PreAuthorize 失效 背景问题解决备注 背景 最近在搞一个后端项目&#xff0c;登录、接口权限、token认证。 版本 Spring Boot 3.2.0 JDK 21 Spring Security 6.2.0 问题 PreAuthorize 失效&#xff0c;没有走认证。 解决 给PreAu…

SD-WAN可以加速视频会议吗?

在企业对远程办公和视频会议的需求越来越多的背景下&#xff0c;网络连接的速度和稳定性对于确保视频会议的顺利进行变得至关重要。那么&#xff0c;SD-WAN组网作为一种网络优化方案&#xff0c;它可以加速视频会议吗&#xff1f; SD-WAN加速的原理在于通过优化网络传输路径和减…

深度学习 | 前馈神经网络与反向传播算法

目录 一、Logistic函数 二、前馈神经网络&#xff08;FNN&#xff09; 三、反向传播算法&#xff08;BP算法&#xff09; ​四、基于前馈神经网络的手写体数字识别 一、Logistic函数 Logistic函数是学习前馈神经网络的基础。所以在介绍前馈神经网络之前&#xff0c;我们首…

RHEL8_Linux使用podman管理容器

本章主要介绍使用 podman 管理容器 了解什么是容器&#xff0c;容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像 1.了解容器及和镜像的关系 对于初学者来说&#xff0c;不太容易理解什么是容器&#xff0c;这里举一个例子。想象一下…

crmeb v5自动生成代码报错(adminInfo方法或404路由不存在的问题)

404 现象 调试器中出现了404 , 那肯定是路由出了问题,也就是说,crmeb 为我们生成的路由没有对应的加载上,先来看一下, 自动代码为我们生成的路由是什么样子的 所以有一种最简单的解决办法,就是 把 新生成的路由文件从子目录中挪出一级来,就可以解决404的问题了 下面来说…

机器学习的12个基础问题

1.阐述批归一化的意义 算法 1&#xff1a;批归一化变换&#xff0c;在一个 mini-batch 上应用于激活 x。 批归一化是一种用于训练神经网络模型的有效方法。这种方法的目标是对特征进行归一化处理&#xff08;使每层网络的输出都经过激活&#xff09;&#xff0c;得到标准差为 …

MX6ULL学习笔记(九)MISC设备驱动

前言 misc 的意思是混合、杂项的&#xff0c;因此 MISC 驱动也叫做杂项驱动。也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动&#xff0c;通常嵌套在 platform 总线驱动中&#xff0c;实现复杂的驱动&#xff0…

.NET医院检验系统LIS源码,使用了oracle数据库,保证数据的隔离和安全性

医院检验系统LIS源码&#xff0c;LIS系统全套商业源码 LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理&#xff08;采集、传输、处理、输出、发布&#xff09;、报表管理过程的自动化&#xff0c;使实验室的操作人员和管理者从繁杂的手工劳…

开利网络的数字化技术加持下,加快扶贫和乡村振兴的效果和进程!

今日&#xff0c;来自山区省份的从事公益、区域民族文化传播、帮扶贫困地区脱贫、农业兴村贵州项目组一行来开利进行数字化脱贫、帮助乡村振兴解决方案探讨交流&#xff0c;交流中&#xff0c;开利网络总结出历经多年实践验证且行之有效的数字化经营、数字化建设经验得到与会成…

Elasticsearch:使用 OpenAI 生成嵌入并进行向量搜索 - nodejs

在我之前的文章&#xff1a; Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09;&#xff08;四&#xff09;​​​​​ 我详细地描述了如何使用…

做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)

19. 删除链表的倒数第 N 个结点 最初的想法进阶实现&#xff08;Java&#xff09; 最初的想法 计算出链表中的节点总数&#xff0c;然后遍历找到目标节点并删除。 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode cur head;int count0;w…

直流电、交流电、电磁波、光之间的联系

直流电、恒定磁场、交流电、交变磁场、电磁波、光之间的联系 频率为0Hz的直流电及恒定磁场 从频率的角度上看&#xff0c;直流电与恒定磁场的方向不变&#xff0c;频率为0Hz. 如可充电锂离子电池的电压3.7V, 干电池的电压1.5V. 磁铁的磁场方向从N极到S极&#xff0c;始终保持…

9mysql存储过程,存储函数和触发器

MySql 存储过程和触发器_mysql存储过程和触发器-CSDN博客文章浏览阅读162次。MySql存储过程、存储函数和触发器_mysql存储过程和触发器https://blog.csdn.net/chenniorange/article/details/132376605存储过程例子 -- A. 定义局部变量, 记录累加之后的值; -- B. 每循环一次, 就…

Ai 算法之Transformer 模型的实现: 一 、Input Embedding模块和Positional Embedding模块的实现

一 文章生成模型简介 比较常见的文章生成模型有以下几种&#xff1a; RNN&#xff1a;循环神经网络。可以处理长度变化的序列数据&#xff0c;比如自然语言文本。RNN通过隐藏层中的循环结构来传递时间序列中的信息&#xff0c;从而使当前的计算可以参照之前的信息。但这种模型…

一个算法一个例题教会你算法---0-1背包问题

动态规划 0-1背包问题 0-1背包问题就是求在有重量限制的情况下如何装入价值最大的物品。 啥也别说&#xff0c;直接看题&#xff1a; 现在有四个可以放的物品&#xff0c;w代表重量&#xff0c;v代表价值。 step1&#xff1a; 我们列一个背包重量 j 从0到5的表格&#xff0…

【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

00. 目录 文章目录 00. 目录01. GPIO之LED电路图02. GPIO之LED接线图03. LED闪烁程序示例04. LED闪烁程序下载05. LED流水灯接线图06. LED流水灯程序示例07. 蜂鸣器接线图08. 蜂鸣器程序示例09. 下载10. 附录 01. GPIO之LED电路图 电路图示例1 电路图示例2 02. GPIO之LED接线图…

Navicat 技术指引 | 适用于 GaussDB 分布式的数据查看器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

CNN发展史脉络 概述图整理

CNN发展史脉络概述图整理&#xff0c;学习心得&#xff0c;供参考&#xff0c;错误请批评指正。 相关论文&#xff1a; LeNet&#xff1a;Handwritten Digit Recognition with a Back-Propagation Network&#xff1b; Gradient-Based Learning Applied to Document Recogniti…

leaflet使用热力图报L找不到的问题ReferenceError: L is not defined at leaflet-heat.js:11:3

1.在main.js中直接引入会显示找不到L 2.解决办法 直接在组件中单独引入使用 可以直接显示出来。 至于为什么main中不能引入为全局&#xff0c;我是没找到&#xff0c;我的另外一个项目可以&#xff0c;新项目不行&#xff0c;不知哪里设置的问题

在linux服上使用nginx+tomcat部署若依前后端分离版本(RuoYi-Vue)

一、先拉工程&#xff0c;地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 二、在window上用idea打开跑通&#xff0c;可参考…