数据结构与算法===回溯法

文章目录

  • 原理
  • 使用场景
    • 括号生成
    • 代码
  • 小结

原理

回溯法是采用试错的思想,它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能得分步解答再次尝试寻找问题的答案。

百度百科是这么解释的。

使用场景

现在聊聊使用场景的问题,之前的文章深度优先采用的就是回溯的思想。就是在当前层级一个一个试完,然后再去下一个层级遍历。可以去看看这篇文章。下边再看一个案例吧。

括号生成

在这里插入图片描述

代码

这个是Java的,如下:

class Solution {ArrayList<String> result = new ArrayList<>();public List<String> generateParenthesis(int n) {_generate(0, 0, n, "");return result;}private void _generate(int left, int right, int n, String s) {if (left == right && left == n) {result.add(s);return;}if(left < n) {_generate(left + 1, right, n, s + "(");}if (left > right) {_generate(left, right + 1, n, s + ")");}}
}

下边看看c++的,如下:

class Solution {shared_ptr<vector<string>> cache[100] = {nullptr};
public:shared_ptr<vector<string>> generate(int n) {if (cache[n] != nullptr)return cache[n];if (n == 0) {cache[0] = shared_ptr<vector<string>>(new vector<string>{""});} else {auto result = shared_ptr<vector<string>>(new vector<string>);for (int i = 0; i != n; ++i) {auto lefts = generate(i);auto rights = generate(n - i - 1);for (const string& left : *lefts)for (const string& right : *rights)result -> push_back("(" + left + ")" + right);}cache[n] = result;}return cache[n];}vector<string> generateParenthesis(int n) {return *generate(n);}
};

小结

本篇聊了下回溯算法,使用场景,及代码。

本篇主要聊了回溯算法,使用场景,代码。深度优先是一个很好的例子,在当前层级一直试错,直到成功;当然,极端情况可能是不成功,那样的话算法复杂度就是指数级了。可以看下代码实现,生成括号是个不错的选择。OK,翻篇。

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

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

相关文章

函数模板底层本质

#include<iostream> using namespace std;template<typename T1> T1 ave(T1 a, T1 b) { return a b; }int main() {ave(100, 200);ave(short(100), short(200));return 0; }反汇编代码 模板本质是编译器帮忙生成了不同的函数 就算非类型参数值不一样编译器也重新…

HCIP(BGP综合实验)--8

一&#xff1a;实验要求 二&#xff1a;实现过程 &#xff08;一&#xff09;配置IP地址&#xff1a; AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […

2024OD机试卷-按身高和体重排队 (java\python\c++)

题目:按身高和体重排队 题目描述 某学校举行 运动会 ,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的 编号顺序关系。请输出排列后的学生编号。 输入描述 两个序列,每个序列由…

TM1650 并联在I2C 信号线的处理方法

目的是可以并联多个TM1650 在标准I2C 总线上&#xff0c;并且不影响其他标准I2C 器件。思路就是拿个额外的开关控制每一片TM1650 的使能&#xff0c;就像SPI 的CS 信号那样。 协议 TM1650 的通信协议虽说不是标准I2C&#xff0c;但也算是比较兼容的&#xff0c;比方说&#x…

springboot实现Aop

一、原理 AOP&#xff08;Aspect Oriented Programming&#xff09;的意思是&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可对业务逻辑进行增强&#xff0c;在不改变原有逻辑的基础上&#xff0c;在其前后进…

JVM调优:JVM常用调优命令和参数

JVM调优是调整和配置Java虚拟机&#xff08;JVM&#xff09;的过程&#xff0c;以便最大限度地提高应用程序的性能和效率。这涉及到调整内存设置、选择合适的垃圾收集器&#xff0c;以及配置各种性能参数。 今天我们来了解一下参数如何设置 JVM调优的重要性 1.通过调整JVM参数…

YOLOv8独家原创改进: AKConv(可改变核卷积)

1.AKConv原理介绍 地址:2311.11587 (arxiv.org) 摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为…

合肥知识付费系统解决方案,培训机构试听课不理想要怎么转化成学员?

现在到处都是培训机构&#xff0c;机构之间的竞争也是越发激烈的&#xff0c;很多机构为了获得生源&#xff0c;都会利用试听课来让家长或孩子&#xff0c;感受机构教学以及服务&#xff0c;那培训机构试听课不理想要怎么转化学员&#xff1f; 因为机构的试听课课程并不是同一种…

基于yolov8+gradio目标检测演示系统设计

YOLOv8与Gradio&#xff1a;开启目标检测的可视化新篇章 随着人工智能技术的飞速发展&#xff0c;目标检测作为计算机视觉领域的重要分支&#xff0c;已经广泛应用于安防监控、自动驾驶、医疗影像等多个领域。而YOLO&#xff08;You Only Look Once&#xff09;系列算法作为目…

光线追踪的渲染流程

光线追踪是一种基于物理的渲染技术&#xff0c;它模拟了光线在场景中的传播和相互作用过程。以下是光线追踪的基本渲染流程&#xff1a; 场景描述&#xff1a; 首先&#xff0c;需要描述场景&#xff0c;包括物体的几何形状、材质、光源等信息。每个物体通常由其几何形状&#…

23种设计模式学习导航

23种设计模式在Java中是一种重要的软件开发原则&#xff0c;旨在提高代码的可维护性、可扩展性和重用性。这些设计模式分为创建型模式、结构型模式和行为型模式三类。以下是这23种设计模式的Java完整版学习导航&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 单例模…

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发&#xff0c; 当开发完成后&#xff0c;需要把开发的功能部署到测试环境供测试人员进行测试使用&#xff0c; 等测试人员测试通过后&#xff0c;我们会将项目部署到生成环境上线使用。 这个时…

Spring中用到的设计模式有哪些

工厂模式,BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象。 单例模式,Spring依赖注入Bean实例默认是单例的。Spring依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创…

手写8大排序算法Java版

如何手写8大排序算法&#xff1a;从入门到精通 排序算法是计算机科学中最基本的算法之一&#xff0c;几乎所有编程语言的面试都会涉及到排序算法的问题。掌握排序算法不仅能够帮助你更好地理解数据结构和算法&#xff0c;还能提升你解决实际问题的能力。本文将带你从零开始&am…

VSCode调试Typescript

目录 背景介绍安装运行问题提示没有npm或者tsc命令提示tsc : 无法加载文件ts-debugObject.defineProperty(exports, __esModule, { value: true })调试时自动断点 背景介绍 由于近期要涉及鸿蒙相关的功能&#xff0c;之前没有接触过TS这个语言&#xff0c;所以想要熟悉一下。 …

Unity曲线插件Dreamteck Splines生成曲线Mesh

一、需求 脱离编辑器&#xff0c;运行时添加点&#xff0c;动态生成管道、线缆等曲线Mesh。 二、Dreamteck Splines简单运用 这方面资料不多&#xff0c;只有官方文档全英参考&#xff0c;而且又介绍得不详细。 2个重要组件介绍&#xff1a; SplineComputer&#xff1a; 最…

yum、rpm相关命令-工具手册

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…

设计模式——备忘录模式(Memento)

备忘录模式&#xff08;Memento Pattern&#xff09;&#xff0c;也称为快照模式或Token模式&#xff0c;是GoF&#xff08;Gang of Four&#xff0c;四位设计模式专家&#xff09;提出的23种设计模式之一&#xff0c;属于行为模式。该模式的主要目的是在不破坏封装性的前提下&…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下&#xff1a; CUDA&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive cudnn&#xff1a;https://developer.nvidia.com/rdp/cudnn-archive 版本&#xff1a;CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA&#xff08;Compute Unified De…