37回溯算法-理论基础

news2024/11/27 10:34:58

目录

什么是回溯算法

基本思想

问题场景

回溯算法的理解

回溯算法模板

LeetCode之路——257. 二叉树的所有路径

分析


什么是回溯算法

回溯算法是一种解决组合优化问题、搜索问题以及决策问题的算法。它通常用于尝试在一组可能的解决方案中搜索并找到满足特定条件的解。回溯算法通过逐步构建解决方案,如果在某一步无法继续前进,就会回溯到上一步,尝试其他选择,直到找到满足条件的解或搜索空间被完全探索。

基本思想
  1. 从初始状态开始,尝试选择一个可能的决策。

  2. 检查选择的决策是否符合问题的约束和条件。

  3. 如果符合,继续下一步;如果不符合,取消选择(回溯)。

  4. 重复步骤1和步骤2,直到找到解决方案或搜索空间被完全探索。

问题场景
  • 组合问题:从一组元素中选择一个子集,使其满足特定条件。

  • 排列问题:对一组元素进行排列,使其满足特定条件。

  • 子集问题:找出一组元素的所有子集。

  • 棋盘问题:在棋盘上寻找可行的路径或解决方案。

  • 图论问题:在图中寻找路径或解决方案。

回溯算法通常是一种递归算法,其中递归函数用于处理每一步的决策和回溯。算法的关键部分是正确地实现选择和取消选择的逻辑,以确保在搜索空间中正确地前进和回退。

回溯算法的理解

理解回溯算法的关键是正确地实现选择和取消选择的逻辑,并理解问题的约束条件。

在解决复杂问题时,通常需要考虑优化策略,如剪枝、启发式搜索等,以提高算法的效率。回溯算法在解决许多实际问题中非常有用,因此它是一种重要的算法技巧。

回溯法解决的问题都可以抽象为树形结构,直白的说一棵高度有限的树(N叉树)。

  • 回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。

  • 递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

回溯算法模板

建议诸君根据基本思想理解,这里简单举个例子:

// 1. 从初始状态开始,尝试选择一个可能的决策。
// 2. 检查选择的决策是否符合问题的约束和条件。
// 3. 如果符合,继续下一步;如果不符合,取消选择(回溯)。
// 4. 重复步骤1和步骤2,直到找到解决方案或搜索空间被完全探索。
void backtrack(参数) {
    // 找到解决方案或搜索空间被完全探索 = 终止条件
    if (终止条件) {
        存放结果;
        return;
    }
    
    // 从初始状态开始,尝试选择一个可能的决策。(回溯算法是一颗N叉树)
    for (决策 : 本次集合中元素) { // 节点的孩子数量就是集合的大小
        处理节点;
        backtrack(路径, 选择列表); //  符合,继续下一步
        回溯,撤销处理结果; // 不符合,取消选择(回溯)
    }
}

LeetCode之路——257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

img

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100]

  • -100 <= Node.val <= 100

分析

1.终止条件:当前节点是叶子节点。

2.递归的条件:有子节点

  • 非叶子节点:继续递归

  • 叶子节点:追加路径

/**
 * 树节点定义
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> list = new ArrayList<String>();
        getPath(root, "", list);
        return list;
    }
​
    public void getPath(TreeNode node, String path, List<String> list) {
        if (node != null) {
            path += node.val;
            // 叶子节点,追加路径
            if (node.left == null && node.right == null) {
                list.add(path);
            } else {
                path += "->";
                getPath(node.left, path, list);
                getPath(node.right, path, list);
            }
        }
    }
}
  • 时间复杂度:O(n^2)

  • 空间复杂度:O(n^2)

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

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

相关文章

C++入门05—指针

1. 指针的基本概念 指针的作用&#xff1a; 可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示 可以利用指针变量保存地址 2. 指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名&#xff1b; 示例&#xff1a; …

如何防“AI换脸”诈骗

风险提示 “AI换脸”诈骗利用仿真技术冒充亲人、同事或公职人员声音相貌行骗&#xff0c;此类新型网络诈骗手段多样、门槛降低、辨别难度加大&#xff0c;常令公众放松警惕&#xff0c;短时间内造成较大损失。国家金融监督管理总局北京监管局近日发布风险提示&#xff1a;眼见…

震惊!原来BUG是这么理解的!什么是BUG?软件错误(BUG)的概念

较为官方的概念&#xff1a; 当且仅当规格说明是存在的并且正确&#xff0c;程序与规格说明之间的 不匹配才是错误。 当需求规格说明书没有提到的功能&#xff0c;判断标准以最终用户为准&#xff1a;当程序没有实现其最终用户合理预期的 功能要求时&#xff0c;就是软…

类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)

在之前的系列文章里&#xff0c;我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT&#xff0c;我们继续补完该系列。 今天要讲到的是小波分解&#xff0c;通常也就是指离散小波变换&#xff08;Discrete Wavelet Transform, DWT&#xff09;。在网上有一些介绍该方法…

AnyLogic 8.8.1---8.8.4 Crack,旧版不搞了

AnyLogic&#xff0c;是一款应用广泛的&#xff0c;对离散、系统动力学、多智能体和混合系统建模和仿真的工具。它的应用领域包括&#xff1a;物流、供应链、制造生产业、行人交通仿真、行人疏散、城市规划建筑设计、Petri网、城市发展及生态环境、经济学、业务流程、服务系统、…

Linux - 环境变量 - 常规命令 和 内建命令

推荐书籍&#xff0c;《深入理解Linux内核》。鸠摩搜书 | 全网电子书搜索引擎&#xff0c;小说人必备 | Tbox导航 (tboxn.com) 寄存器 你应该知道&#xff0c;代码是被加载到内存当中&#xff0c;cpu才能进行运算的&#xff0c;那么&#xff0c;我们在写函数返回值的时候&…

飞利浦双串口51单片机485网关

主要功能将PC端的数据接收下来&#xff0c;分发到不同的设备&#xff0c;也是轮询设备数据读取回来&#xff0c;打包回传到PC端&#xff0c;数据包包头包尾识别&#xff0c;数据校验&#xff0c;接收超时处理&#xff0c;将协议结构化处理&#xff0c;协议的改动不需要改动程序…

Python 算法高级篇:图的表示与存储优化

Python 算法高级篇&#xff1a;图的表示与存储优化 引言 1. 什么是图&#xff1f;2. 图的基本概念3. 图的表示方法3.1. 临接矩阵表示临接矩阵的优点&#xff1a;临接矩阵的缺点&#xff1a; 3.2. 邻接表表示邻接表的优点&#xff1a;邻接表的缺点&#xff1a; 4. 优化的存储方法…

开机流程、模块管理

一、开机流程 Linux系统组成 kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能rootfs 包括程序和 glibc 库 ​ 程序&#xff1a;二进制执行文件​ 库&#xff1a;函数集合, function, 调用接口&#xff08;头文件负责描述&#xff09; 开机流程…

13.6性能测试理论

一.什么是性能测试 1.定义: 测试人员借助性能测试工具(LoadRunner等),模拟系统在不同场景下(使用高峰期等),对应的性能指标是否达到预期. 2.性能测试和功能测试的区别: a.功能测试依靠人工,性能测试依靠工具. b)功能测试要求软件能正常运行,不管什么场景,性能测试要求软件…

[双指针] (二) LeetCode 202.快乐数 和 11.盛最多水的容器

[双指针] (二) LeetCode 202.快乐数 和 11.盛最多水的容器 快乐数 202. 快乐数 题目解析 (1) 判断一个数是不是快乐数 (2) 快乐数的定义&#xff1a;将整数替换为每个位上的和&#xff1b;如果最终结果为1&#xff0c;就是快乐数 (3) 这个数可能变为1&#xff0c;也可能无…

ESP-IDF编程指南

ESP-IDF 编程指南 - ESP32-C3 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com) ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP-IDF 物联网开发框架 | 乐鑫科技 (espressif.com.cn)

【Git企业开发】第二节.Git 的分支管理

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Git企业级开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff0…

一款功能强大的iOS设备管理软件Mazing 3中文版免费2024最新下载

Mazing 3中文版是一款功能强大的iOS设备管理软件&#xff0c;它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外&#xff0c;它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性&#xf…

解读deepLabV3+时遇到的问题总结

环境问题 python &#xff1a;3.10.12 ModuleNotFoundError: No module named ‘torchvision.models.utils 起初pip以下这个包&#xff0c;也没有解决问题&#xff1b;后来发现是版本的问题。 #from torchvision.models.utils import load_state_dict_from_url from torch.…

机器人入门(四)—— 创建你的第一个虚拟小车

机器人入门&#xff08;四&#xff09;—— 创建你的第一个虚拟小车 一、小车建立过程1.1 dd_robot.urdf —— 建立身体1.2 dd_robot2.urdf —— 添加轮子1.3 dd_robot3.urdf —— 添加万向轮1.4 dd_robot4.urdf —— 添加颜色1.5 dd_robot5.urdf —— 添加碰撞检测(Collision …

印度财团欲代工iPhone,路虎是前车之鉴,印度制造仍在梦中

随着印度财团塔塔收购纬创即将落寞&#xff0c;印度电子与科技国务部长强德拉谢克&#xff08;Rajeev Chandrasekhar&#xff09;为塔塔站台&#xff0c;表示两年内塔塔将制造iPhone并出口海外市场&#xff0c;印度制造将由此起飞。 一、印度制造在路虎上梦破 塔塔集团收购路虎…

手把手教你:如何用Java多线程模拟银行叫号服务

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我将和大家一起探讨一个非常有趣的话题——Java多线程模拟银行叫号服务。这不仅是一个有趣的编程练习&#xff0c;还可以帮助我们更好地理解多线程编程和并发控制。在这篇文章中&#xff0c;我将带领大家一步步实现一个…

cmd基本命令

一、cmd黑框是什么 cmd 是 Windows 命令提示符&#xff08;cmd.exe&#xff09;是 Windows NT 及以后的 Windows 系统下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序&#xff1b;或在 Windows CE 下只用于运行控制面板程序的外壳程序。 二、打开步骤 wind…

Tornado downloadable工程和Tornado bootable工程

目录 Tornado downloadable工程Tornado bootable工程 Tornado downloadable工程和Tornado bootable工程是两个不同类型的Tornado项目。 Tornado downloadable工程 Tornado downloadable工程是指可以通过下载安装程序来安装的Tornado项目,通常用于Web应用程序。这种工程通常包…