自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 看一遍就懂:动态规划详解

动态规划是一种将问题“分而治之”的高效方法,核心在于拆分子问题、保存中间结果、避免重复计算。它适用于有重叠子问题和最优子结构的问题。通过本篇文章的青蛙跳台阶与最长递增子序列两个案例,我们掌握了从状态定义、边界处理、状态转移方程推导到代码实现的完整套路。只要理解了这些关键步骤,动态规划其实并不难,是值得深入掌握的重要算法技能。

2025-07-16 22:08:38 919

原创 一文搞懂二叉树及其特殊形式:AVL树、红黑树、堆与哈夫曼树(含代码解析)

本文系统介绍了二叉树及其特殊变种的数据结构与实现。首先阐述了二叉树的定义和5种基本形态,然后重点讲解了6种特殊二叉树:二叉搜索树(BST)、AVL树、堆、哈夫曼树和红黑树,包括它们的特点、应用场景和实现原理。针对每种树结构,文章都提供了完整的C语言实现代码,涵盖基本操作如插入、删除、查找等。这些树结构通过不同的平衡机制(如旋转、着色等)保证了高效的操作性能(O(logn)时间复杂度),在搜索、排序、压缩编码等领域有广泛应用。本文通过示意图和代码示例,帮助读者深入理解这些重要数据结构的设计思想与实现方法。

2025-06-27 16:53:01 854

原创 解决Hash冲突的四种方法(含代码解析)

本文系统介绍了哈希表冲突的四种经典解决方法:开放定址法(含线性探测、二次探测和双重哈希)、链地址法、再哈希法和公共溢出区法。开放定址法通过表内探查节省空间但易产生聚集;链地址法使用链表结构简单但需额外内存;再哈希法采用多哈希函数减少聚集但实现复杂;公共溢出区法隔离冲突元素适合特定场景。每种方法各具特色,实际选择需综合考虑数据特征和性能需求。理解这些冲突处理机制对优化哈希表设计、提升系统性能具有重要意义。

2025-06-18 17:20:46 798

原创 几种简单的排序算法(C语言)

本文系统地介绍了几种经典排序算法,包括冒泡、选择、插入、快速、归并、希尔、堆、基数排序等,结合 C 语言实现,从原理到代码细节进行了深入解析。通过对每种算法的基本思路、适用场景和时间复杂度的比较,读者可以全面了解各类排序算法的优势与局限,为日后编程实践、算法竞赛或技术面试打下坚实基础。这不仅有助于掌握排序的核心思想,也提升了解决实际问题的能力。

2025-06-07 15:32:33 1175

原创 数据结构之二叉树

本文介绍了二叉树的基本概念及其在数据结构中的重要性,特别是二叉搜索树(BST)的应用。文章详细描述了如何使用C语言实现一个简单的二叉搜索树,包括节点的插入、中序、前序、后序遍历以及树的释放等基本操作。通过代码示例,展示了如何定义节点结构体、插入新节点、执行不同顺序的遍历以及安全释放树内存。这些基础操作为理解更复杂的树结构(如平衡树和红黑树)奠定了基础。文章强调了二叉搜索树在排序和检索等领域的应用,并提供了完整的代码实现和解析,适合初学者学习和实践。

2025-05-15 23:14:06 694

原创 利用MinGW编译OpenCV源码

在进行图像处理和计算机视觉相关开发时,OpenCV 是最常用的开源库之一。然而,OpenCV 官方默认仅提供了基于 MSVC(Microsoft Visual C++)编译的预编译版本,这对于习惯使用 MinGW(Minimalist GNU for Windows)或在 CLion 等跨平台 IDE 中进行开发的用户来说并不友好。为了在 MinGW 环境下顺利使用 OpenCV,我们通常需要自行从源码编译。

2025-04-12 16:55:47 885

原创 CLion安装、配置及使用

这篇关于 CLion 的安装、配置及使用的教程详细介绍了从软件下载安装、环境变量配置,到编译器设置、新建项目等全流程操作,适用于初学者快速上手使用 CLion 进行 C/C++ 开发。通过图文并茂的步骤说明,即使是第一次接触 CLion 的用户,也能顺利完成环境搭建并开始编程,提高开发效率,为后续深入学习打下坚实基础。对小白而言确实障碍重重,但也是必经之路;在这之前,或许就是本篇文章存在的意义。

2025-04-04 15:20:49 4674 1

原创 重建二叉树(C++)

该算法使用前序遍历和中序遍历的特点,通过递归重建二叉树。在每一步中,通过根节点在中序遍历中的位置来划分左子树和右子树,避免了不必要的遍历。提供了 O(1) 时间复杂度的查找功能,使得整体算法在时间和空间上的效率都得到了保证。整个算法的时间复杂度为 O(n),空间复杂度为 O(n),其中 n 是二叉树的节点数量。

2025-03-31 21:54:50 763

原创 序列化二叉树(C++)

本文详细解析了二叉树的序列化和反序列化的实现方法。首先,通过层序遍历方式进行序列化,使用代表空节点,并利用queue和构造序列化字符串。反序列化时,首先检查输入是否为空,随后利用queue辅助构造二叉树,逐步恢复原树结构。整个过程的时间和空间复杂度均为 O(n)O(n),保证了高效性。代码解析部分逐步讲解了序列化和反序列化的每个关键步骤,使读者能够清晰理解并灵活运用该方法。

2025-03-29 23:17:14 1448

原创 数据结构之队列

队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构,支持元素的入队(enqueue)和出队(dequeue)操作。本文实现了顺序队列的初始化、插入、删除、查询等基本操作,并利用循环队列的方式优化了存储空间,提高了性能。此外,代码中还实现了约瑟夫环(Josephus Problem)算法,通过队列模拟该问题的求解过程。本文介绍了基于数组的队列实现,包括初始化、入队、出队、队列判空、获取队列大小等操作,并使用队列解决了约瑟夫环问题。

2025-03-25 14:24:45 1421

原创 数据结构之栈

栈(Stack)是一种线性数据结构,遵循“后进先出(LIFO, Last In First Out)”的原则。本文基于顺序存储方式实现栈的初始化、入栈、出栈、获取栈顶元素、判断是否为空、获取栈大小及十进制转二进制等操作。相比链式栈,顺序存储的栈操作更加简单,访问速度更快,适用于数据量较小且需要快速存取的场景,如表达式求值、函数调用管理、深度优先搜索等。本文介绍了栈的基本概念及其顺序存储的实现方式。通过栈,我们可以快速完成数据的压入和弹出操作,实现 LIFO 结构。

2025-03-24 19:42:36 1263

原创 数据结构之双链表

双向链表(Doubly Linked List)是一种链式存储结构,每个节点包含数据域和前驱、后继指针,支持双向遍历。本代码实现了双向链表的初始化、插入、删除、查找、反转等操作,并维护头尾指针以优化性能。相比单链表,双向链表在插入和删除时无需额外查找前驱节点,适用于频繁修改数据结构的场景,如缓存管理、文本编辑器等。本文介绍了双向链表的基本概念及其在 C 语言中的实现,涵盖了链表的初始化、节点插入、删除、查找、反转等核心操作。

2025-03-22 14:36:06 1516

原创 头歌 JAVA 桥接模式实验

这样,通过客户端代码配置不同的 FileConvertor 子类和 DataHandler 子类(如 OracleHandler 或 SQLServerHandle),即可实现从不同数据库读取数据并转换成不同格式的功能,而无需修改已有代码。

2025-03-19 08:37:49 1046 2

原创 判断是不是完全二叉树(C++)

首先,代码检查根节点是否为空,若为空,则直接返回true,因为空树是完全二叉树。然后,定义一个队列q,用于进行层序遍历(BFS),并将根节点root入队。变量mustBeLeaf用于标记是否遇到了空节点,一旦为true,后续所有节点必须为空,否则就不是完全二叉树。通过队列依次遍历每个节点,并使用布尔变量mustBeLeaf来标记是否已经遇到空节点,确保一旦出现nullptr,后续所有节点都必须为空,否则返回false。该方法能有效检测是否存在不连续的叶子节点,从而正确判断完全二叉树的性质。

2025-03-18 21:17:25 1189

原创 数据结构之单链表

单链表是最基础的数据结构之一,它以动态存储的方式高效处理数据的插入和删除。本文将通过C语言代码实现两种单链表(头插法和尾插法),分析它们的核心操作,并对比其性能差异。单链表作为动态存储结构的代表,通过头插法和尾插法展现了不同的数据管理策略。**头插法**以`O(1)`的时间复杂度在链表头部快速插入节点,适合逆序构建数据(如撤销操作),但会导致数据存储顺序与插入顺序相反。**尾插法**通过维护尾指针实现尾部`O(1)`插入,能严格保持数据顺序,适用于日志记录等场景。

2025-03-17 21:12:43 1588

原创 判断是不是二叉搜索树(C++)

本文总结了如何判断一棵二叉树是否为有效的二叉搜索树。文章首先描述了问题的要求,即左子树节点值需小于根节点、右子树节点值需大于根节点。接着,介绍了利用中序遍历特性(遍历结果为严格递增序列)来验证BST性质的方法:先通过递归中序遍历将节点值存入数组,再遍历数组检查是否严格递增。详细的代码实现和解析使读者能够清晰地理解整个解题思路和过程。

2025-03-16 23:33:46 1093

原创 二叉搜索树与双向链表(C++)

本文详细介绍了如何将一棵二叉搜索树(BST)转换为一个排序的双向链表。通过利用中序遍历的特性,我们可以在遍历过程中调整节点的指针,将二叉搜索树转换为一个有序的双向链表。代码实现中,通过递归函数InOrder完成中序遍历,并在遍历过程中维护一个prev指针,用于记录当前节点的前驱节点,从而建立双向链表的前驱和后继关系。最后,通过向左遍历找到链表的头节点并返回。该方法的时间复杂度为 O(n),空间复杂度为 O(1),满足题目要求。

2025-03-13 12:31:04 1160 3

原创 数据结构之线性表

线性表是数据结构中最基础且常用的一种结构,它是由一组具有相同类型的元素组成的有序序列。线性表可以通过顺序存储或链式存储来实现。本文将重点介绍顺序存储的线性表,并通过C语言代码来展示其基本操作。data:指向存储元素的数组。size:当前线性表的大小(即元素个数)。capacity:线性表的最大容量。int *data;// 存储元素的数组int size;// 当前大小// 最大容量} List;顺序存储的线性表是一种简单且高效的数据结构,适用于元素数量相对固定且需要频繁访问的场景。

2025-03-11 11:08:23 1150

原创 数据结构基础

在计算机科学中,数据结构与算法是构建高效程序的核心。无论是开发一个简单的应用程序,还是设计复杂的系统,理解数据结构与算法的基本原理都是至关重要的。本文将带你从数据结构的基础概念出发,逐步深入到算法分析的核心内容。数据结构与算法是计算机科学的基础,理解它们的原理和应用对于编写高效的程序至关重要。通过合理设计数据结构和算法,我们可以在处理大规模数据时显著提升程序的性能。无论是顺序存储、链式存储,还是时间复杂度、空间复杂度的分析,都是我们在实际开发中需要掌握的核心技能。

2025-03-09 21:36:29 1004

原创 二叉树的前、中、后序遍历(C++)

本文通过代码示例介绍了二叉树的三种深度优先遍历方法——前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根),并使用递归方式实现。递归方法直观易懂,符合树的天然递归结构,每种遍历方式都遵循固定的访问顺序:前序遍历先访问根节点,再遍历左子树和右子树;中序遍历先遍历左子树,再访问根节点,最后遍历右子树;后序遍历则先遍历左右子树,最后访问根节点。本文提供清晰的 C++ 代码示例,并分析递归的工作原理,帮助读者深入理解二叉树的遍历过程及其应用。

2025-03-06 15:10:19 1019

原创 OpenCV下载与配置(vistual studio 2022)

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,广泛应用于图像处理、目标检测、视频分析等领域。本文将详细介绍OpenCV在visual studio 2022中的下载与配置过程,帮助读者快速搭建 OpenCV 开发环境。本文详细介绍了 OpenCV 在 Visual Studio 2022 中的下载、安装与配置过程,包括环境变量的设置、VS 配置步骤,以及附带的代码测试示例。

2025-03-05 22:03:07 2389 6

原创 比较版本号(C++)

定义指针a和b,分别遍历version1和version2。本文详细解析了版本号比较问题的解法,包括问题描述、解题思路、代码实现以及代码解析。在解决该问题时,我们使用了双指针遍历version1和version2,逐个提取分隔的修订号并转换为整数进行比较。通过忽略前导零,确保了1.01与1.1视为相等。同时,未指定的修订号默认为0,保证"1.1"和"1.1.0"也能正确比较。该算法时间复杂度为O(n),空间复杂度为O(1),适用于较长的版本号比较。

2025-03-05 20:03:11 1001

原创 SQL命令详解之常用函数

在SQL中我们经常会用到一些字符串、数学、日期时间和条件函数,下面通过多个实际案例演示了它们的应用。例如,如何截取字符串、转换大小写、计算平均值、处理日期差值等。此外,还包含SQL练习题,如筛选无效推文、修复用户名格式、计算学生平均成绩、查找温度上升的日期、统计活跃用户数等,帮助读者加深对SQL查询和数据处理的理解。本文介绍了SQL中常用的字符串、数学、日期时间和条件函数,详细解释了它们的语法和使用方法。

2025-03-04 12:14:26 1001

原创 旋转数组中的最小值(C++)

本文讨论了在旋转排序数组中寻找最小值的问题,并提供了两种解法:暴力遍历和二分查找。暴力解法通过遍历数组,找到第一个下降点确定最小值,时间复杂度为 O(n)。二分查找利用数组部分有序的特点,逐步缩小搜索范围,在 O(log n) 时间复杂度内找到最小值。代码解析部分详细讲解了两种方法的实现逻辑,包括边界情况的处理。整体而言,本文结合理论分析与代码实现,提供了高效解决该问题的思路,适用于需要掌握二分查找优化的读者。

2025-03-04 12:04:12 743

原创 SQL命令详解之多表查询(连接查询)

本文介绍了MySQL中的连接查询,包括内连接和外连接的使用方法。内连接查询用于获取两个表中交集部分的数据,分为隐式内连接和显式内连接两种方式。通过内连接,我们可以实现多表联合查询,如查询学生的姓名、课程名称和成绩。外连接查询分为左外连接和右外连接,左外连接返回左表的所有数据和右表匹配的数据,而右外连接则返回右表的所有数据和左表匹配的数据。通过外连接,我们能够处理一些不完全匹配的数据,比如查找连续出现至少三次的数字。通过本文的练习,读者可以掌握多表查询的基本技巧,并理解连接查询的实际应用。

2025-03-03 18:55:34 1692

原创 数组中的逆序对(C++)

本文介绍了两种计算数组逆序对的方法:暴力解法和归并排序法。暴力解法使用两层嵌套循环,逐一比较元素,时间复杂度为O(n^2),适用于小规模数据。归并排序法利用归并排序的分治思想,结合双指针合并两个有序子数组,并在合并过程中统计逆序对,时间复杂度降为O(n log n),适用于大规模数据。具体实现中,递归地拆分数组,合并时通过比较左右子数组元素,累加逆序对数量。归并排序法高效、稳定,且满足题目对时间和空间的复杂度要求,是解决该问题的推荐方案。

2025-03-03 18:25:16 1400

原创 SQL命令详解之子查询

子查询是嵌套在其他 SQL 查询中的查询。它可以出现在SELECTFROMWHEREHAVING等子句中。子查询通常用于在主查询中提供一个临时的结果集,作为主查询进一步筛选、计算或关联的依据。本文系统地介绍了 SQL 子查询 在不同场景下的应用,包括 FROM、WHERE 和 HAVING 子查询。首先,FROM 子查询用于构建临时表,帮助解决复杂查询问题,例如查找最大单一数字。其次,WHERE 子查询通过筛选条件进行数据过滤,例如查找上级经理已离职的员工。

2025-03-02 16:15:53 828

原创 寻找峰值(C++)

本文介绍了如何使用 暴力解法 和 二分查找 解决峰值元素问题。首先,暴力解法通过贪心策略,从数组的第一个元素开始,逐步判断当前元素与下一个元素的大小关系,直到找到一个不再递增的位置,即为峰值,时间复杂度为 O(N)。其次,二分查找方法利用分治思想,通过设置左右边界并不断缩小搜索范围,时间复杂度优化至 O(logN),更适合处理大规模数据。通过二分查找,可以高效地找到任意一个峰值的位置,同时也确保了算法的稳定性。最后,结合这两种解法,读者可以根据具体问题规模选择最适合的方案,实现高效的峰值元素查找。

2025-03-02 11:33:57 950

原创 SQL命令详解之数据的查询操作

本篇 SQL 学习笔记系统地总结了查询操作的各个方面,包括基础查询、条件查询、排序、聚合、分组及分页等内容。通过详细的语法解析和实践练习,涵盖了从简单的数据检索到复杂的数据处理方法,帮助理解 SQL 在实际应用中的关键用法。同时,笔记中提供了具体的 SQL 练习案例,使读者能够在实践中掌握高效查询的技巧。掌握这些 SQL 技巧,不仅能够提高数据库操作能力,还能为优化查询性能和处理复杂数据分析奠定坚实基础。

2025-03-01 20:24:41 1610

原创 二分查找-I(C++)

代码使用右偏二分查找,mid取右侧值,确保left指向target可能存在的位置。时,left = mid,否则,逐步缩小搜索范围。然而,可能导致left无法有效更新,出现死循环。因此,更安全的做法是使用作为循环条件,并调整mid计算方式,以确保二分查找能够正确收敛,提高算法的稳定性和可靠性。

2025-03-01 20:10:44 991

原创 SQL命令详解之增删改数据

在数据库操作中,增、删、改是最基础的操作,它们通常对应着SQL中的INSERTDELETE和UPDATE命令。今天,我们将深入探讨这三种命令的使用方法及其作用。INSERTUPDATE和DELETE。INSERT命令用于将新数据插入到表中,支持单行和多行插入,并能够从其他表选择数据进行插入;UPDATE命令用于修改现有数据,但需特别小心使用WHERE条件,以免错误地更新所有记录;DELETE命令则用于删除表中的数据,缺少WHERE条件时可能会导致删除所有记录。

2025-02-28 19:25:44 1167

原创 删除有序链表中重复的元素-II(C++)

代码通过遍历排序链表,删除所有重复的节点,保留唯一的元素。使用一个虚拟头节点简化链表操作,并用两个指针cur和p分别负责遍历原链表和构建去重后的新链表。当遇到重复节点时,跳过所有重复元素,直到找到一个不同的节点,继续将其添加到新链表中。最终返回去重后的链表。

2025-02-28 16:10:37 597

原创 SQL命令详解之操作数据表

本文介绍了操作数据表的基本知识,包括常见的 MySQL 数据类型、字段约束和表的创建、查询、修改与删除操作。掌握数据表的增删改查(CRUD)是数据库管理的基础,理解不同的数据类型和约束能够帮助设计高效、可靠的数据库结构。通过实践操作,我们能够更好地理解如何在 MySQL 中进行表结构设计、数据操作以及优化表之间的关系,提高数据库管理的能力。

2025-02-27 13:59:50 901

原创 删除有序链表中重复的元素-I(C++)

代码实现了一个高效的链表去重算法,通过使用两个指针(left和right)遍历链表,比较相邻节点的值,删除重复元素。通过调整left的next指针来保留不重复的节点,最终确保链表无重复元素。

2025-02-27 13:18:53 561

原创 SQL命令详解之操作数据库

SQL 是用于管理和操作关系型数据库的标准语言,其中数据库操作是核心功能之一。常见的数据库操作包括:查询所有数据库 ()、创建数据库 (CREATE DATABASE 数据库名称;,避免重复创建可加)、删除数据库 (DROP DATABASE 数据库名称;,避免错误可加IF EXISTS)、使用数据库 (USE 数据库名称;)、查询当前使用的数据库 () 等。这些基本命令帮助用户高效地创建、管理和切换数据库,是数据库管理的基础。

2025-02-26 19:21:14 974

原创 链表的奇偶重排(C++)

代码实现了将链表按照奇偶顺序重新排列的功能。首先,通过两个指针分别提取奇数位置和偶数位置的节点,然后将奇数节点连接成一个链表,再将偶数节点连接成另一个链表。最终,将两个链表合并,返回重新排列后的链表。该方法通过创建新节点并重新连接链表来实现奇偶排序,避免了改变原链表的结构。

2025-02-26 14:46:45 1087

原创 判断一个链表是否为回文结构(C++)

代码通过快慢指针找到链表的中点,并反转后半部分链表,最后比较前后两部分是否一致,以此判断链表是否是回文链表。

2025-02-25 13:25:52 695

原创 单链表的排序(C++)

本文介绍了如何使用归并排序对链表进行排序。首先通过Merge函数合并两个有序链表,再通过sortInList函数递归地拆分链表并排序。归并排序的优势在于其稳定性和 O(nlog⁡n)O(n \log n) 的时间复杂度,尤其适合链表结构的排序,因为它不需要额外的数组空间。通过快慢指针的拆分和递归合并,最终实现了一个高效的链表排序算法。

2025-02-24 23:13:19 642

原创 链表相加(二)(C++)

代码实现了链表形式的大整数相加,逻辑清晰,效率较高。首先,反转两个链表,使其从低位到高位存储,然后逐位相加,处理进位,并构建新的链表存储结果。计算完成后,再次反转结果链表,使其恢复为高位到低位存储顺序。

2025-02-23 23:51:32 416

原创 两个链表的第一个公共结点(C++)

通过双指针法,巧妙地解决了链表长度不一致的问题,并且在O(n)时间复杂度内找到了两个链表的第一个公共节点。这种方法既简单又高效,适用于链表相关的问题中。

2025-02-11 15:03:04 489

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除