算法通关村第18关【青铜】| 回溯

news2025/4/26 7:07:26

回溯算法是一种解决组合优化问题和搜索问题的算法。它通过尝试各种可能的选择来找到问题的解决方案。回溯算法通常用于问题的解空间非常大,而传统的穷举法会导致计算时间爆炸的情况。回溯算法可以帮助限制搜索空间,以提高效率。

回溯算法的核心思想是在搜索问题的解空间时,逐步地构建解决方案,并在发现当前解决方案无法达到最终目标时,返回上一步(回溯),并尝试另一个选择,一直重复这个过程,直到找到问题的解或确定无解。

以下是回溯算法的一般步骤:

  1. 选择:从问题的解空间中选择一个候选解,通常是从多个选择中的一个。

  2. 验证:验证当前候选解是否满足问题的约束条件,如果不满足,则舍弃这个候选解。

  3. 继续搜索:如果当前候选解通过验证,继续在下一个阶段中构建更多的解决方案。

  4. 回溯:如果当前选择无法达到问题的最终目标,需要回溯到上一个阶段,撤销之前的选择,然后尝试其他选择。

  5. 结束条件:当找到问题的解或确定无解时,算法结束。

回溯算法适用于各种组合优化问题,如八皇后问题、旅行推销员问题、子集生成问题,以及图搜索问题等。这些问题都有一个共同点,即它们的解空间非常庞大,但回溯算法通过递归和剪枝来减小搜索空间,以有效地找到问题的解决方案。

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

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

1. 二叉树的所有路径

思路:使用回溯模板

(1)确定方法返回值和参数

分析可知遍历树然后添加结点值,不需要返回什么值

参数也就是node,list,path

(2)确定回溯终止条件

当碰到叶子结点的时候终结

(3)确定单层逻辑

判断当前是不是叶子结点,是的话就添加path进结果集

不是就继续向下递归

当递归返回的时候需要进行回溯,也就是弹出上一个已经使用过的结点值

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> list = new ArrayList<String>();
        List<Integer> path = new ArrayList<Integer>();
        trace(root,list,path);
        return list;
    }
    public void trace(TreeNode root,List list,List path){
        path.add(root.val);
        if(root.left == null&&root.right == null){
            StringBuilder sb = new StringBuilder();
            sb.append(path.get(0));
            for(int i = 1;i<path.size();i++){
                sb.append("->");
                sb.append(path.get(i));
            }
            list.add(sb.toString());
        }
        if(root.left!= null){
            trace(root.left,list,path);
            path.remove(path.size()-1);
        }
        if(root.right!= null){
            trace(root.right,list,path);
            path.remove(path.size()-1);
        }

    }
}

2.路径总和

思路:使用回溯模板

(1)确定方法返回值和参数

分析可知遍历树然后添加将各个结点值求和,不需要返回什么值

参数也就是node,list,path,target

(2)确定回溯终止条件

当碰到叶子结点的时候终结

(3)确定单层逻辑

判断当前是不是叶子结点并且target等于0,是的话就添加path进结果集

不是就继续向下递归

当递归返回的时候需要进行回溯,也就是弹出上一个已经使用过的结点值

class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<Integer> path = new ArrayList<Integer>();
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        trace(root,list,targetSum,path);
        return list;
    }

    public void trace(TreeNode root,List list,int targetSum,List path){
        if(root == null){
            return ;
        }
        path.add(root.val);
        targetSum -= root.val;
        if(targetSum == 0&&root.left == null&&root.right == null){
            list.add(new LinkedList<>(path));
        }
        if(root.left != null){
            trace(root.left,list,targetSum,path);
            path.remove(path.size()-1);
        }
        if(root.right != null){
            trace(root.right,list,targetSum,path);
            path.remove(path.size()-1);
        }
    }
}

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

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

相关文章

ARM作业2

.设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 头文件key_it.h #ifndef __KEY_IT_H__ #define …

没有炫光的台灯有哪些?2023五款优秀护眼台灯

很多家长有时候会说孩子觉得家里的台灯灯光刺眼&#xff0c;看书看久了就不舒服。这不仅要看光线亮度是否柔和&#xff0c;还要考虑台灯是不是有做遮光式设计。没有遮光式设计的台灯&#xff0c;光源外露&#xff0c;灯光会直射孩子头部&#xff0c;孩子视线较低&#xff0c;很…

【小米技术分享】面试题:什么是乐观锁?你是如何设计一个乐观锁

大家好&#xff0c;我是小米。今天我们来聊一下面试中常见的一个问题&#xff1a;“什么是乐观锁&#xff1f;你是如何设计一个乐观锁&#xff1f;”作为一位热爱技术的程序员&#xff0c;对于这个问题&#xff0c;我有着自己独特的理解和实践经验。接下来&#xff0c;我将以通…

flink1.15 savepoint 超时报错 java.util.concurrent.TimeoutException

savepoint命令 flink savepoint e04813d4e7480c526912eb4d32bba510 hdfs://flink/flink/migration/savepoint56650 -Dyarn.application.id=application_1683808492336_1222报错内容 org.apache.flink.util.FlinkException: Triggering a savepoint for the job e04813d4e7480…

通讯网关软件023——利用CommGate X2HTTP实现HTTP访问Modbus TCP

本文介绍利用CommGate X2HTTP实现HTTP访问Modbus TCP。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统上位机、PLC、设备具备Modbus RTU通讯接口&#xff0c;现在…

【计算机网络】——前言计算机网络发展的历程概述

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法&#xff1a;算法专栏 C头…

Python编程必备:掌握列表遍历的6种神级技巧!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python 遍历列表是Python中最常见的任务之一&#xff0c;因为列表是一种非常常用的数据结构&#xff0c;它用于存储一组项目。 在编程中&#xff0c;经常需要对这些项目进行操作&#xff0c;例如查找特定元素&#xff…

【LeetCode】2.两数相加

目录 1 题目2 答案2.1 我写的&#xff08;不对&#xff09;2.2 更正 3 问题 1 题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返…

如何创建自定义前端组件?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

淘宝历史价格数据接口,淘宝商品历史价格接口,淘宝API接口

淘宝历史价格数据接口采集方法如下&#xff1a; 找到适当的淘宝API接口&#xff0c;该接口需要一个淘宝客的授权码才能使用。使用一个开发工具&#xff0c;比如Python编程语言和Requests库来调用该API接口并获取数据。在调用API时需要指定开始时间和结束时间来获取特定商品在时…

快速搭建Linux网站,并利用内网穿透实现宝塔面板的公网访问【内网穿透】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

DataGridView-----datagridviewcomboboxcolumn

今天项目中需要实现下拉框展示数据。同时我们需要进行对应的数据绑定和保存。以下是常见的两种方式。 1. 绑定数据库数据源 2. 直接输入的list集合。 3. 出现的问题 问题&#xff1a;使用datagridviewcomboboxcolumn时&#xff0c;默认第一次以及将鼠标点击到当前行时&#…

ipad有必要用手写笔吗?性价比电容笔排行榜

随着技术的进步&#xff0c;各种新型的数字电子产品不断涌现。比如说&#xff0c;智能手机、ipad、电容笔之类的东西。但事实上&#xff0c;要将iPad的功能发挥到极致&#xff0c;我认为&#xff0c;这款电容笔&#xff0c;就必不可少的了。这就好像我们在ipad平板上书写东西&a…

QT运行界面与画布大小不一致问题(一步到位)

QT运行界面与画布大小不一致问题 出现的问题直接设置环境变量main函数中输入以下代码更改系统缩放比好了&#xff0c;看一下运行结果吧 出现的问题 当我们运行程序时&#xff0c;发现运行出来的大小和设计的几面大小有很大的差别&#xff0c;这使我们开发起来就特别的困难&…

【设计模式】七、适配器模式

文章目录 现实生活中的适配器例子基本介绍工作原理举例&#xff1a;类适配器模式类适配器模式介绍类适配器模式应用实例 举例&#xff1a;对象适配器模式基本思路对象适配器模式应用实例 举例&#xff1a;接口适配器模式接口适配器模式应用实例适配器模式在 SpringMVC 框架应用…

GPT-4V的图片识别和分析能力

GPT-4V是OpenAI开发的大型语言模型&#xff0c;是GPT-4的升级版本。GPT-4V在以下几个方面进行了改进&#xff1a; 模型规模更大&#xff1a;GPT-4V的参数量达到了1.37T&#xff0c;是GPT-4的10倍。训练数据更丰富&#xff1a;GPT-4V的训练数据包括了1.56T的文本和代码数据。算…

国有企业合同领域的合规管理

随着中国经济的快速发展和市场经济体制的完善&#xff0c;国有企业在国民经济中的地位和作用日益凸显。作为经济主体之一&#xff0c;国有企业必须积极适应市场环境的变化&#xff0c;加强合同管理&#xff0c;提高合规水平&#xff0c;以实现持续发展目标。本文将围绕国有企业…

pycharm设置pyuic和pyrcc

pyuic设置 适合任何虚拟环境&#xff0c;直接用虚拟环境的python解决一切。。。 E:\anaconda3\envs\qt5\python.exe-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py$FileDir$pyrcc设置 E:\anaconda3\envs\qt5\python.exe-m PyQt5.pyrcc_main $FileName$ -o…

深入浅出了解华为云API网关的Gzip功能

Gzip是什么 Gzip是一种用于数据压缩的编码格式&#xff0c;经常被使用在基于HTTP协议的网络传输中。Gzip功能允许服务器在传输数据是对其进行压缩&#xff0c;从而减小传输的数据量&#xff0c;加快页面加载速度&#xff0c;这对于节省带宽和提高用户体验非常有用。本文将从Gz…

你觉得工作开心重要还是赚钱重要?

对于大多数的普通人来说&#xff0c;开心和钱都重要&#xff0c;但是都得不到。我觉得最重要的不是做取舍&#xff0c;或者说不是做我认清楚了哪个重要就可劲地去争取哪样。 真正要做得&#xff0c;而是我们在自己现有的境况下找到自己的最优解&#xff0c;如何在这世人皆苦的环…