当前位置: 首页 > news >正文

DFS算法系列 回溯

DFS算法系列-回溯

文章目录

  • DFS算法系列-回溯
    • 1. 算法介绍
    • 2. 算法应用
      • 2.1 全排列
      • 2.2 组合
      • 2.3 子集
    • 3. 总结

1. 算法介绍

回溯算法是一种经典的递归算法,通常被用来解决排列问题、组合问题和搜索问题

基本思想

从一个初始状态开始,按一定的规则向前搜索,当搜索遇到瓶颈无法再前进时,回到当前状态的上一个状态,按照新的要求/条件继续向前搜索,直至所有可用条件都遍历完成。

简单的说就是:不撞南墙不回头

对于回溯算法,其核心就在于不断的"试错",若选择正确则继续往下搜索,否则就"回头"选择另一个选项继续往下搜索。

下面提供一个回溯算法的模板(模板只是对算法理解的总结概况,相较于没有思考的套模板,理解其中的算法思想更加重要–>通过做题积累)

List<List<Integer>> ret;
List<Integer> path; void dfs(int[] nums, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中ret.add(new ArrayList<>(path));return;}// 遍历所有选择for (int i = 0;i < nums.size();i++) {// 做出选择path.add(nums[i]);  // 做出当前选择后继续搜索dfs(path, nums);// 恢复现场path.remove(path.size() - 1);}
}

其中path用来记录每次选择后改变的路径nums[i]表示当前做出的选择,并且在当前选择满足递归结束条件后,将当前路径添加到结果集中,结束当前层递归并恢复现场,即恢复刚刚完成修改的路径到上一个状态,才能继续处理当前层的另一个选择,如下图所示:

在这里插入图片描述

了解完回溯算法,我们来做一些相关的算法题加深印象!

2. 算法应用

对于回溯(以及DFS相关的题),建议的解题步骤:

  1. 先画决策树
  2. 根据决策树编写函数体,可设置全局变量、添加剪枝提高效率;
  3. 找到递归出口

2.1 全排列

题目链接:[全排列]

决策树

在这里插入图片描述

代码示例

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[nums.length];dfs(nums);return ret;}void dfs(int[] nums) {if (path.size() == nums.length) {ret.add(new ArrayList(path));return;}for (int i = 0;i < nums.length;i++) { // 这里让i=0,使下一层选项依旧为所有情况(1,2,3,4)if (!check[i]) { // check数组用来记录当前数字是否被使用check[i] = true;   path.add(nums[i]); // 将数字添加到路径中dfs(nums);check[i] = false;path.remove(path.size() - 1);}}}
}

2.2 组合

题目链接:[组合]

决策树:

在这里插入图片描述

代码示例

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;int len;int pre;public List<List<Integer>> combine(int n, int k) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[n + 1];len = k;int[] nums = new int[n + 1];for (int i = 1;i <= n;i++) {nums[i] = i;}dfs(nums, 1);return ret;}public void dfs(int[] nums, int pos) {if (path.size() == len) { // 当路径长度和要求的组合数相等时返回ret.add(new ArrayList<>(path));return;}for (int i = pos;i <= nums.length - 1;i++) { // 这里让i=pos,使下一层选项不会出现当前数字,并且下层选项从pos+1开始if (!check[i]) {	path.add(nums[i]);  check[i] = true;dfs(nums, i + 1);path.remove(path.size() - 1);check[i] = false;}}}
}

注:这里让i=pos,使下一层选项不会出现当前数字,并且下层选项从pos+1开始若为i = 0,则使下一层选项依旧为所有情况(1,2,3)

在这里插入图片描述

2.3 子集

题目链接:[子集]

决策树

在这里插入图片描述

代码示例

class Solution {static List<List<Integer>> ret;static List<Integer> path;public List<List<Integer>> subsets(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();dfs(nums, 0);return ret;}public void dfs(int[] nums, int cur) {ret.add(new ArrayList<>(path)); // 此处不设出口目的是将每个节点路径都添加到ret中for (int i = cur;i < nums.length;i++) { // 这里让i=cur,使下一层选项不会出现当前数字,并且下层选项从cur+1开始path.add(nums[i]);dfs(nums, i + 1);path.remove(path.size() - 1); }}
}

3. 总结

总的来说,回溯就是不断的"试错"并回头进行新的选择,和回溯相关的题就要把决策树画出来,通过它来找到我们的递归出口并编写函数体(注意for循环中起始标的使用),注意记得恢复现场哦!

相关文章:

DFS算法系列 回溯

DFS算法系列-回溯 文章目录 DFS算法系列-回溯1. 算法介绍2. 算法应用2.1 全排列2.2 组合2.3 子集 3. 总结 1. 算法介绍 回溯算法是一种经典的递归算法&#xff0c;通常被用来解决排列问题、组合问题和搜索问题 基本思想 从一个初始状态开始&#xff0c;按一定的规则向前搜索&…...

Linux C应用编程:MQTT物联网

1 MQTT通信协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传 输&#xff09;是一种基于客户端-服务端架构的消息传输协议&#xff0c;如今&#xff0c;MQTT 成为了最受欢迎的物联网协议&#xff0c;已广泛应用于车联网、智能家居、即时聊…...

企业常用Linux文件命令相关知识+小案例

远程连接工具无法连接VMWARE&#xff1a; 如果发现连接工具有时连不上&#xff0c;ip存在&#xff0c;这时候我们查看网络编辑器&#xff0c;更多配置&#xff0c;看vnet8是不是10段&#xff0c;nat设置是否是正确的&#xff1f; 软件重启一下虚机还原一下网络编辑器 查看文件…...

Istio介绍

1.什么是Istio Istio是一个开源的服务网格&#xff08;Service Mesh&#xff09;框架&#xff0c;它提供了一种简单的方式来为部署在Kubernetes等容器编排平台上的微服务应用添加网络功能。Istio的核心功能包括&#xff1a; 服务治理&#xff1a;Istio能够帮助管理服务之间的…...

代码随想录算法训练营第四十七天|leetcode115、392题

一、leetcode第392题 本题要求判断s是否为t的子序列&#xff0c;因此设置dp数组&#xff0c;dp[i][j]的含义是下标为i-1的子串与下标为j-1的子串相同字符的个数&#xff0c;可得递推公式是通过s[i-1]和t[j-1]是否相等区分。 具体代码如下&#xff1a; class Solution { publ…...

将Ubuntu18.04默认的python3.6升级到python3.8

1、查看现有的 python3 版本 python3 --version 2、安装 python3.8 sudo apt install python3.8 3、将 python3.6 和 3.8 添加到 update-alternatives sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --insta…...

Python和Java哪个更适合后端开发?

Python和Java都是强大的后端开发语言&#xff0c;它们各自有鲜明的特点和适用场景。选择哪一个更适合后端开发&#xff0c;主要取决于具体的项目需求、团队技术栈、个人技能偏好以及长期发展考虑等因素。 下面是两者在后端开发中的优势和劣势&#xff1a; 「Python&#xff1…...

Python+pytest接口自动化之cookie绕过登录(保持登录状态)

前言 我们今天来聊聊pythonpytest接口自动化之cookie绕过登录&#xff08;保持登录状态&#xff09;&#xff0c;在编写接口自动化测试用例或其他脚本的过程中&#xff0c;经常会遇到需要绕过用户名/密码或验证码登录&#xff0c;去请求接口的情况&#xff0c;一是因为有时验证…...

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成&#xff08;Data Integration&#xff09;&#xff0c;简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中&#xff0c;我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中&#xff0c;使其具有相关性并易于使用。 数据集成&#xff1…...

国外EDM邮件群发多少钱?哪个软件好?

在当今全球化市场环境下&#xff0c;电子邮件营销作为最有效的数字营销渠道之一&#xff0c;其影响力不容忽视。而高效精准的EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销策略更是企业拓展海外市场、提升品牌知名度的关键手段。云衔科技以其创新的智能EDM邮件营…...

C语言入门算法——回文数

题目描述&#xff1a; 若一个数&#xff08;首位不为零&#xff09;从左向右读与从右向左读都一样&#xff0c;我们就将其称之为回文数。 例如&#xff1a;给定一个十进制数 56&#xff0c;将 56 加 65&#xff08;即把 56 从右向左读&#xff09;&#xff0c;得到 121 是一个…...

OceanBase—操作实践

文档结构 1、概念简介2、核心设计3、操作实践3.3、数据同步 官方文档&#xff1a;https://www.oceanbase.com/docs/oceanbase-database-cn 1、概念简介 版本分为社区版和企业版&#xff0c;其中企业版兼容MySQL 和Oracle数据库语法&#xff1b; 2、核心设计 存储层 复制层 …...

智慧用电安全管理系统

智慧用电安全管理系统 智慧用电安全管理系统是智能电网中客户侧关键的构成部分&#xff0c;是基本建设新型智慧城市的基本&#xff0c;将完成地区内各种各样用电设备的智能化系统监管&#xff0c;完成地区内日常生活与工作中安全性、舒服。 一、智慧用电安全管理系统介绍 …...

Rust语言入门第二篇-Cargo教程

文章目录 Rust语言入门第二篇-Cargo教程一&#xff0c;Cargo 是什么二&#xff0c;Cargo教程Cargo.toml文件src/main.rs 文件构建并运行Cargo项目 Rust语言入门第二篇-Cargo教程 本节提供对cargo命令行工具的快速了解。我们演示了它为我们生成新包的能力&#xff0c;它在包内编…...

测试用例的编写方式

学习目标 能对穷举场景设计测试点能对限定边界规则设计测试点能对多条件依赖关系进行设计测试点能对于项目业务进行设计测试点 目录 等价类划分法案例 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 有效等…...

HarmonyOS实战开发-状态管理、通过使用页面级的状态变量 和应用级的状态变量 来实现应用的状态管理。

介绍 本示例通过使用页面级的状态变量 和应用级的状态变量 来实现应用的状态管理。 效果预览 使用说明 1.点击首页中的基本类型进入对应页面&#xff0c;点击按钮可以更改圆形的颜色&#xff1b;点击查看源码可以展示基本类型功能效果的源码。 2.点击首页中的数组类型进入对…...

【Java开发指南 | 第二篇】标识符、Java关键字及注释

专栏&#xff1a;Java开发指南 CSDN秋说 文章目录 标识符Java关键字Java注释 标识符 Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。 所有的标识符都应该以字母&#xff08;A-Z 或者 a-z&#xff09;,美元符&#xff08;$&#xff09;、或者下划线&…...

3D可视化技术:研发基地的科技新篇章

在科技日新月异的今天&#xff0c;我们生活在一个充满无限可能性的时代。而在这个时代中&#xff0c;3D可视化技术正以其独特的魅力&#xff0c;引领着科技领域的新一轮变革。 3D可视化技术通过三维图像的方式&#xff0c;将现实世界或虚拟世界中的物体、场景等以立体、逼真的形…...

蓝旭前端05:JavaScript进阶

蓝旭前端05&#xff1a;JavaScript进阶 基础简单复习 数据类型 基本数据类型&#xff1a;Number、String、Boolean、Null、Undefined等。引用数据类型&#xff1a;Object、Array、Function等。typeof操作符&#xff1a;返回数据类型的字符串形式。 变量 变量声明&#xff1…...

【docker-compose】安装及配置

目录 安装在线安装离线安装 配置mysql5.7bitnami/mysql8.3redisweb前后台分离部署前端https(SSL)配置nginx动态传参资源限制&#xff1a;内存、cpunacossentinelgateway 问题汇总iptables No chain/target/match by that namedocker-compose.yml修改mysql密码&#xff0c;重启后…...

如何在macOS上制作Windows启动盘:WinDiskWriter终极指南

如何在macOS上制作Windows启动盘&#xff1a;WinDiskWriter终极指南 【免费下载链接】windiskwriter &#x1f5a5; A macOS app that creates bootable USB drives for Windows. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址: h…...

基于cartographer算法的自主导航系统仿真设计 移动机器人系统具备定位、建图及路径规划功能

基于cartographer算法的自主导航系统仿真设计 移动机器人系统具备定位、建图及路径规划功能&#xff0c;在迷宫式的环境中建模导航。 模型以及移动机器人模型&#xff0c;移动机器人模型包含2D激光雷达传感器、轮式里程计以及惯性导航原件 基于cartographer算法建图&#xff0c…...

基于西门子PLC的矿井通风控制系统(含IO表、PLC引脚图、程序) PLC程序设计,价格便宜

基于西门子PLC的矿井通风控制系统&#xff08;含IO表、PLC引脚图、程序&#xff09; PLC程序设计&#xff0c;价格便宜&#xff0c;plc触摸屏上位机程序设计&#xff0c;编写。 西门子plc仿真程序设计 提供程序说明&#xff0c; plc程序代写 PLC程序设计、代做 图片为案例 接设…...

OpenClaw:AI 权限治理的核心问题

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…...

高效管理惠普OMEN游戏本:OmenSuperHub全面解析与实战指南

高效管理惠普OMEN游戏本&#xff1a;OmenSuperHub全面解析与实战指南 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普OMEN系列游戏本设计的轻量级系统管理工具&#xff0c;它通过替代原厂Omen Ga…...

LangGraph实战:从零构建并部署一个多功能智能体

1. LangGraph框架概述&#xff1a;新一代智能体开发范式 在人工智能应用开发领域&#xff0c;智能体&#xff08;Agent&#xff09;技术正经历着从简单问答到复杂任务执行的进化。LangGraph作为LangChain生态中的新一代开发框架&#xff0c;彻底改变了传统链式结构的局限性。我…...

高分辨率路面缺陷检测数据集:道路健康状态自动监测的关键资源

路面缺陷检测数据集yolo掌握道路健康状态对于维护和规划都至关重要。 本数据集精选6100张高清图像&#xff0c;专门标注了道路表面的四种常见缺陷&#xff0c;包括鳄鱼状裂纹、横向裂纹、纵向裂纹和坑洞&#xff0c;旨在为道路维护和自动化检测提供强有力的数据支持。 图像集已…...

mmsegmentation训练策略调优全攻略:从学习率预热到迭代次数计算

mmsegmentation训练策略调优实战&#xff1a;从参数配置到显存优化 在图像分割领域&#xff0c;mmsegmentation框架因其模块化设计和丰富的预训练模型而广受欢迎。但真正决定模型性能上限的&#xff0c;往往是那些容易被忽视的训练策略细节。本文将带您深入AdamW优化器的参数微…...

【高通Camera_Tuning】优化树荫下及背景绿植时白平衡偏色问题(一)

参考案例&#xff1a;在室外拍摄时白平衡正常&#xff0c;但遇到树荫下或背景有绿植时出现偏色&#xff08;偏蓝&#xff09;问题。可通过修改绿区解决偏色问题。解决方法&#xff1a;1.开启Green zone在3A文件 -- /* Green */ -- /* Green Projection Enable */将/* Green Pr…...

多项式朴素贝叶斯

多项式朴素贝叶斯&#xff08;二分类&#xff09; 题意 实现一个 Multinomial Naive Bayes 二分类器。 train&#xff1a;二维列表&#xff0c;每行最后一列为标签 y \in \{0,1\}&#xff0c;其余列为非负整数词频test&#xff1a;二维列表&#xff0c;仅包含词频特征&#xff…...