自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++入门】02、C++程序初识

本文介绍了C++编程基础要点:1.程序结构由函数组成,从main()开始执行;2.基本语法元素包括注释、预处理指令、函数声明和语句;3.变量需要先声明后使用,通过赋值运算符初始化;4.使用cout/cin进行输入输出,<<和>>分别表示数据流向;5.类作为自定义数据类型,包含数据格式和操作方法;6.函数需先声明原型再定义实现。C++对大小写敏感,语句以分号结束,通过名称空间管理代码库。这些构成了C++程序的基本框架和核心概念。

2025-12-08 18:10:16 501

原创 【算法专题训练】33、堆

本文介绍了堆数据结构及其应用。堆分为最大堆(父节点值≥子节点)和最小堆(父节点值≤子节点),通常用完全二叉树实现。堆支持插入和删除操作,C++中可通过priority_queue实现。堆常用于解决Top K问题:最小堆求前K大元素,最大堆求前K小元素。文中给出了两个LeetCode题目示例:LCR 059使用最小堆维护数据流中第K大元素,LCR 060结合哈希表和最小堆找出前K高频元素。总结指出堆操作的关键在于维护堆性质,并强调堆在Top K问题中的高效性。

2025-12-03 21:00:00 737

原创 【C++入门】01、C++简介

C++是什么?是一门编程语言,是在C语言基础上,添加了对面向对象编程和泛型编程支持,还有STL标准函数库的支持调用C++语言的创建历史,主要是为了更加好用,解决C语言过程化编程的限制一个C++语言程序的创建过程,从源代码文件,到编译链接,到最后程序的执行。

2025-11-27 21:30:00 545

原创 【算法专题训练】32、二叉搜索树

本文介绍了二叉搜索树的相关算法题解,包括: 递增顺序搜索树(LCR 052):通过中序遍历将二叉搜索树重构为只有右子节点的递增链表; 二叉搜索树的中序后继(LCR 053):给出两种解法(迭代遍历和利用二叉搜索树特性)寻找指定节点的后继; 转换为累加树(LCR 054):通过反中序遍历(右-根-左)累加节点值; 二叉搜索树迭代器(LCR 055):设计支持中序遍历的迭代器,提供next()和hasNext()方法。 这些题目充分利用了二叉搜索树的中序遍历特性,展示了如何通过遍历顺序调整来解决不同问题。

2025-11-26 18:30:00 507

原创 【算法专题训练】31、二叉树路径和

本文介绍了三道关于二叉树路径问题的LeetCode题目及解法。第一题(LCR 049)求根节点到叶节点数字之和,采用前序遍历,累计路径数字;第二题(LCR 050)统计路径总和等于目标值的路径数目,使用前序遍历结合哈希表记录路径和;第三题(LCR 051)求二叉树中的最大路径和,通过后序遍历比较不同路径组合。三题均采用递归方法,但处理方式各异:第一题累计数字,第二题利用哈希表优化查找,第三题比较多种路径组合。这些题目展示了二叉树路径问题的不同变种及相应解法。

2025-11-19 18:30:00 1316

原创 【算法专题训练】30、二叉树的应用

本文介绍了两个二叉树相关算法:剪枝和序列化/反序列化。 二叉树剪枝:要求删除所有节点值全为0的子树。采用后序遍历,先处理左右子树,若子树全为0则剪除。提供两种实现方式:一种使用布尔返回值判断是否剪枝,另一种直接返回处理后的节点。 二叉树序列化与反序列化:使用前序遍历实现。序列化时空节点用"#"表示,节点间用逗号分隔;反序列化时分割字符串并递归重建二叉树。 关键点: 剪枝适合后序遍历,自底向上处理 序列化/反序列化适合前序遍历,需处理空节点标记 两种算法都利用了递归思想,体现了二叉树遍历的

2025-11-14 18:30:00 572

原创 【算法专题训练】29、树的深度优先遍历

本文系统介绍了二叉树的三种深度优先遍历方法。文章首先定义了二叉树的基本结构,包括节点定义和基本特性。重点阐述了中序、前序和后序遍历的实现方式,分别给出了递归和迭代两种实现代码。对于迭代实现,详细说明了使用栈结构模拟递归过程的具体步骤,包括节点访问顺序、栈的操作方法等。最后总结了三种遍历方式的异同点,指出递归方式简洁但抽象,而迭代方式更直观易懂。全文通过代码示例和流程说明,清晰地展示了二叉树深度优先遍历的核心算法实现。

2025-10-31 18:30:00 1605

原创 【QML】001、QML与Qt Quick简介

本文介绍了Qt框架中的QML与Qt Quick技术。Qt6支持两种开发方式:基于C++的Qt Widgets和基于QML的Qt Quick。QML是一种声明式编程语言,专为构建用户界面设计,类似HTML和Dart语言。Qt QML模块提供语言基础和引擎,而Qt Quick模块则提供创建UI所需的各种类型和功能。两者关系为:QML是语言,Qt Quick是类型库,Qt QML实现语言功能,Qt Quick实现库功能。Qt最大优势在于跨平台性,支持"一次编写,多平台编译"。

2025-10-29 19:52:19 246

原创 【算法专题训练】28、队列与二叉树层序遍历

本文介绍了二叉树层序遍历的两种应用场景:LCR 045找树左下角的值和LCR 046二叉树的右视图。解题思路均采用双队列法进行层序遍历,通过交替使用两个队列分别存储当前层和下一层的节点。对于左下角值问题,记录每层队列的首元素;对于右视图问题,记录每层队列的末元素。两种解法的时间复杂度均为O(n),空间复杂度为O(n)。双队列法相比计数法更直观,能清晰区分不同层级的节点,适用于需要处理层级边界值的二叉树问题。

2025-10-28 18:30:00 244

原创 【算法专题训练】27、树的层序遍历

本文介绍了四种解决二叉树每层最大值问题的层序遍历方法。题目要求找出二叉树每一层的最大值并返回结果数组。四种解法核心思路都是通过层序遍历区分不同层级的节点: 空节点占位法:在每层末尾插入空节点作为分隔符 双计数法:使用current和next两个变量分别记录当前层和下一层节点数 单计数法:仅用current变量记录当前层剩余节点数 双队列法:使用两个队列交替存储当前层和下一层节点 作者认为单计数法最为简洁高效,通过维护当前层剩余节点数即可准确识别层间切换时机。这些方法都为处理二叉树层级相关问题提供了实用思路。

2025-10-23 15:29:50 352

原创 【算法专题训练】26、队列应用-广度优先搜索

本文介绍了完全二叉树的插入操作实现。首先解释了广度优先搜索(BFS)在树结构中的应用,然后详细分析了LeetCode题目LCR 043的两种解法:第一种在每次插入时进行完整层序遍历,时间复杂度较高;第二种在初始化时通过队列记录待插入位置,优化了插入效率。两种方法都利用队列实现层序遍历,但第二种方法通过预存待插入节点显著提高了性能。最后总结了完全二叉树的特性及插入操作的关键点:保持完全性、找到合适父节点、使用队列优化遍历过程。该实现确保在插入新节点后仍保持完全二叉树的结构特性。

2025-10-22 20:45:00 189

原创 【算法专题训练】25、队列

本文介绍了队列的基本特性及其在滑动窗口问题中的应用。队列遵循先进先出原则,支持push、pop、front、back等操作。文章通过两个LeetCode题目展示了队列的实际应用:1)实现滑动窗口移动平均值计算,使用队列维护窗口数据并动态更新和值;2)统计最近3000毫秒内的请求次数,利用队列管理时间戳并移除过期请求。这两个案例都充分利用了队列的特性来高效解决问题。最后总结了队列在滑动窗口类问题中的优势,即能自然维护数据进出顺序。

2025-10-17 18:30:00 385

原创 【算法专题训练】24、单调栈

本文介绍了求解柱状图最大矩形面积的三种方法。暴力解法通过双循环遍历所有可能区间,时间复杂度O(N²)。分治法以最小值为界递归计算左右区间,效率有所提升。最优解是单调栈法,维护递增栈结构,在元素出栈时计算当前高度为最小值的矩形面积,时间复杂度O(N)。三种方法中单调栈法效率最高,利用栈的特性快速确定每个柱子的左右边界,从而高效求解最大矩形面积。该解法核心在于保持栈内元素单调递增,并在出栈时计算对应区域的面积。

2025-09-23 18:30:00 387

原创 【算法专题训练】23、栈的应用

本文摘要了两道LeetCode栈相关题目。第一题是行星碰撞问题,使用栈模拟行星碰撞过程,当方向相对的行星相遇时,较大者保留,相同则都消失。第二题是每日温度问题,通过单调栈找到每个温度后面第一个更高温度的天数差。两题均采用栈结构处理元素间的大小关系,通过遍历加栈操作实现高效求解,体现了栈在处理顺序依赖问题中的优势。核心思想都是利用栈暂存元素,在遍历过程中动态处理栈顶与当前元素的关系。

2025-09-22 18:30:00 433

原创 【算法专题训练】22、栈

本文介绍了栈的基本知识和逆波兰表达式的计算。栈是一种后进先出的数据结构,支持入栈(push)、出栈(pop)和获取栈顶元素(peek)操作。文章以LCR 032题为例,讲解如何利用栈计算逆波兰表达式:遍历表达式,遇到数字入栈,遇到运算符则取出栈顶两个数字运算并将结果入栈。最终栈中剩余元素即为表达式结果。代码实现时需注意操作数顺序和字符串转整数的处理。该解法充分体现了栈在表达式求值中的优势。

2025-09-17 19:00:00 262

原创 【算法专题训练】21、哈希表应用

摘要 有效的字母异位词:判断两个字符串是否为字母异位词。通过统计字符出现次数,若字符频率相同且顺序不同则为异位词,否则返回false。使用数组优化小写字母情况,哈希表适配Unicode字符。 字母异位词分组:将字符串数组按异位词分组。对每个字符串排序后作为哈希表键,相同键的字符串归为一组,最后返回分组结果。时间复杂度主要取决于排序。 验证外星语词典:根据给定的字母顺序order,判断字符串数组是否按外星语字典序排列。使用哈希表存储字母顺序,逐字符比较相邻字符串是否符合规则。 最小时间差:计算时间列表中最小时

2025-09-12 19:14:19 958

原创 【算法专题训练】20、LRU 缓存

本文介绍了LRU缓存的实现方法,通过哈希表和双向链表结合的方式实现O(1)时间复杂度的get和put操作。哈希表用于快速查找,双向链表维护数据的使用顺序。关键点包括:使用哨兵节点简化操作,将最近访问数据移至链表尾部,容量满时删除头部节点。特别注意删除节点时要同步更新哈希表,避免访问已删除节点。该设计体现了LRU缓存的核心特性,即优先淘汰最久未使用的数据。

2025-09-10 20:45:00 269

原创 【算法专题训练】19、哈希表

本文介绍了哈希表的基础知识和实现O(1)时间复杂度的随机集合数据结构。哈希表通过数组和链表组合实现快速查找,但需要处理哈希冲突和扩容问题。针对LeetCode LCR 030题,提出使用动态数组存储元素并用哈希表记录位置索引的解决方案,通过交换元素和删除尾部实现O(1)删除操作。随机获取则通过数组索引实现均匀分布。关键点在于数组和哈希表的结合使用,以及元素交换技巧,确保插入、删除和随机访问都能在常数时间内完成。

2025-09-09 19:32:19 291

原创 【算法专题训练】18、循环链表

这篇技术文章介绍了循环链表及其在LeetCode题目LCR 029中的实现。主要内容包括: 循环链表概念:尾节点指向头节点形成环状结构 题目要求:在循环有序链表中插入新节点,保持升序特性 解题思路: 处理空链表和单节点链表的特殊情况 遍历链表寻找合适插入位置 若未找到合适位置,则将新节点插入最大值节点后 代码实现:提供了完整的C++解决方案 总结:强调了循环链表的遍历方法和节点特性 文章通过具体代码示例展示了如何在循环有序链表中正确插入新节点,同时保持链表的有序性。

2025-09-03 14:11:20 223

原创 【算法专题训练】17、双向链表

本文介绍了双向链表的基本概念及其与单向链表的区别,重点讨论了多级双向链表的扁平化问题。双向链表通过增加前驱指针实现双向遍历。针对LCR 028题目,提出递归遍历与迭代结合的解决方案:当遇到子节点时递归处理子链表,将其插入主链表中,并正确处理前后指针关系。代码实现中,通过临时指针变量操作链表,保持原头指针不变,最后断开子节点指针完成扁平化。该算法有效处理了多级链表的层级展开问题,时间复杂度为O(n)。

2025-09-01 17:16:53 334

原创 【算法专题训练】16、反转链表

本文介绍了单链表的基本特点和四道经典链表算法题的解法。单链表具有单向性,只能从头到尾遍历。各题目解法如下:1.反转链表(LCR 024)使用三指针迭代法;2.两数相加(LCR 025)通过链表反转后逐位相加;3.重排链表(LCR 026)先找到中间节点反转后半段,再合并;4.回文链表(LCR 027)使用快慢指针分割链表后反转后半段比较。所有解法均给出详细代码实现,时间复杂度均为O(n)。

2025-08-28 09:45:23 656

原创 【算法专题训练】15、环形链表

本文介绍了两个链表问题的解法:环形链表入口检测和相交链表判断。 环形链表 II:使用快慢指针判断是否存在环,相遇后计算环的节点数,再用双指针定位环入口。 相交链表:将链表A首尾相连形成环,转换为环形链表问题,通过快慢指针找到交点后恢复链表结构。两种解法均采用双指针技巧,时间复杂度O(n),空间复杂度O(1)。

2025-08-21 10:35:06 347

原创 【算法专题训练】14、链表

本文介绍了链表的基本概念和操作方法。链表由节点构成,每个节点包含数据域和指向下一节点的指针域,具有动态分配内存、非连续存储等特点。文章重点讲解了哨兵节点的作用(简化空链表处理)和双指针解法,并以删除链表倒数第N个节点为例,展示了双指针的应用:快指针先移动N步,然后快慢指针同步移动,当快指针到达末尾时,慢指针指向待删除节点的前驱节点。最后总结了链表的核心特性和操作要点,包括必须使用new初始化指针对象等注意事项。

2025-08-19 10:53:56 300

原创 【算法专题训练】13、回文字符串

本文介绍了回文字符串的概念及三类相关算法题解。回文串是指正读反读都相同的字符串,判断时忽略大小写和非字母数字字符。第一类题目LCR 018通过双指针法验证回文串;第二类LCR 019在允许删除一个字符的条件下判断是否可形成回文;第三类LCR 020则统计所有回文子串数量,提供了暴力解法和中心扩展两种方法。核心解法都运用双指针技术,通过从两端向中间或从中间向两端遍历来验证回文特性,并利用isalnum()等函数处理字符验证。这三类问题展示了回文串判断的不同应用场景和解法优化思路。

2025-08-15 17:18:16 461

原创 【算法专题训练】12、使用双指针与哈希表求解字符串的变位词

本文总结了三个字符串处理问题的解题思路与代码实现,均采用双指针加哈希表的方法。首先,LCR 015通过滑动窗口统计字母频率来寻找变位词;其次,LCR 016利用双指针维护无重复字符窗口求最长子串;最后,LCR 017通过动态调整窗口边界来寻找覆盖目标字符的最短子串。这三个问题都体现了滑动窗口和哈希表在字符串处理中的高效应用,通过维护字符频率表来判断窗口满足条件,并适时移动指针来优化解。

2025-08-14 09:38:07 255

原创 【算法专题训练】11、字符串中的变位词

摘要:本文介绍了字符串的基础知识和一道字符串排列相关的算法题。首先讲解了字符串的不可变特性及StringBuilder的使用。然后重点分析LCR 014题,该题要求判断一个字符串是否包含另一个字符串的变位词。解题采用双指针+哈希表(用26位数组实现)的方法:通过统计字符出现次数,滑动窗口遍历比较。代码实现中,利用数组加减操作高效判断字符频率是否匹配,最终得出是否存在变位词的结论。该方法通过优化数据结构选择和遍历策略,达到了较好的时间复杂度。

2025-08-11 19:23:31 353

原创 【算法专题训练】10、累加子数组之和2

求子数组的累加和等于某个目标值,如果数组元素全是正整数,则使用双指针解法,根据累加和与目标值的比较,来移动左右指针的位置。如果数组元素是整数,则双指针解法失效,需要通过判断区域子数组的累加和,使用大的区域减去小的区域的子数组累加和,求得目标值的子数组。需要使用哈希表保存区域子数组的累加和。要求子数组中0和1的元素个数,可以将0元素转换为-1,这样就把问题变为求子数组累加和为0的问题。不管是一维数组还是二维数组,要求某个区域的累加和,都是通过子数组累加和问题,只不过二维比一维数组多考虑一个维度。

2025-08-07 09:39:06 348

原创 【算法专题训练】09、累加子数组之和

求子数组的累加和等于某个目标值,如果数组元素全是正整数,可以使用双指针解法,但数组元素只是整数,那就会存在正整数与负整数,使用双指针累加法就覆盖不到所有结果。暴力解法使用双层for循环,可以检索所有的子数组情况,但时间复杂度为n的平方采用数组累加求和方式,可通过子数组累加和相减得到某段区域的子数组累加和。使用哈希表保存子数组累加和出现的次数map数据结构使用,使用find方法查询key值是否存在,at方法获取value值,还可以使用赋值语句[]获取value值。

2025-08-05 09:41:32 306

原创 【算法专题训练】08、长度最小的子数组

本文介绍了两个使用双指针法解决子数组问题的算法题。第一题要求在数组中找出和大于等于目标值的最短连续子数组长度,通过维护滑动窗口动态调整左右指针来求解。第二题要求统计乘积小于给定值的连续子数组个数,同样采用滑动窗口方法,在满足条件时计算子数组个数。两题都展示了双指针法在解决连续子数组问题中的高效性,通过左右指针协同移动来避免重复计算,达到O(n)的时间复杂度。这种解法适用于需要在数组中寻找满足特定条件的连续子序列的场景。

2025-08-01 09:25:08 193

原创 【算法专题训练】07、三数之和

本文介绍了在数组中寻找和为0的三元组的两种解法。暴力解法通过三层循环实现,时间复杂度为O(n³)。更优的双指针解法先对数组排序,然后固定一个元素,用双指针寻找另外两个元素,时间复杂度为O(n²)。关键点包括:1)排序预处理;2)跳过重复元素避免重复解;3)双指针高效搜索。双指针解法通过排序和去重优化,将时间复杂度从O(n³)降低到O(n²),是更优的解决方案。

2025-07-30 09:56:31 225

原创 【算法专题训练】06、数组&双指针

本文首先介绍了数组的基本特性,包括其连续内存存储、下标访问方式以及固定容量的缺点,并分析了动态数组的扩容机制及其性能问题。接着讲解了指针的概念和双指针技巧,重点阐述了相向双指针和同向双指针的适用场景。随后以LCR 006两数之和问题为例,详细比较了暴力解法、哈希表解法和双指针解法三种实现方式,其中双指针解法充分利用了数组有序的特性,提供了最优解法。最后总结了数组和指针的核心概念,强调了双指针技巧在解决特定问题时的优势。全文通过具体问题分析,系统梳理了数组和指针的相关知识点。

2025-07-29 09:46:14 368

原创 【算法专题训练】05、最大单词长度乘积

题目要求找到两个不含相同字符的字符串,使其长度乘积最大。提供了三种解法: 暴力解法:四重循环逐个比较字符是否重复,时间复杂度高,会超时。 哈希表解法:使用二维数组记录每个字符串包含的字符,将内层比较优化为数组访问,时间复杂度降低到O(n^2)。 位运算解法:将每个字符串的字符集合压缩为一个32位整数,通过位运算快速判断字符是否重复,进一步优化效率。 最优解法是位运算,通过将字符映射为二进制位,使用位与运算判断重复,时间复杂度O(n^2),空间复杂度O(n)。

2025-07-25 14:36:37 380

原创 【算法专题训练】04、只出现一次的数字

本文介绍了两种在数组中找到只出现一次数字的算法。第一种针对其他数字出现两次的情况,使用异或位运算特性(数字异或自己为0),通过遍历数组将所有元素异或得到结果。第二种针对其他数字出现三次的情况,将每个数字转换为二进制形式,统计各位的出现次数后对3取余,最后将余数转为十进制得到结果。文章还总结了异或运算特性、C++数组初始化注意事项以及二进制位数获取方法。这些算法都能在O(n)时间复杂度和O(1)空间复杂度内解决问题。

2025-07-23 09:56:18 266

原创 【算法专题训练】03、比特位计数

摘要: 题目要求计算0到n每个数字的二进制1的个数。暴力解法通过逐位计算,时间复杂度O(nlogn)。优化解法利用位运算性质: 与运算:i & (i-1)可消除最右的1,统计操作次数,时间复杂度O(kn)。 动态规划:基于i & (i-1),递推式为dp[i] = dp[i & (i-1)] + 1,线性时间O(n)。 位移运算:利用奇偶性,dp[i] = dp[i/2] + (i & 1),同样O(n)。动态规划与位移法均高效,推荐使用。

2025-07-18 10:38:24 329

原创 【算法专题训练】02、二进制

摘要: 本文介绍了二进制的基本概念及其在计算机中的应用,并详细讲解了二进制字符串相加的算法实现。二进制由0和1组成,计算机使用二进制存储数据。位运算包括非、与、或等6种操作。以LCR02题目为例,给出了二进制求和的代码实现,核心思路是从字符串末尾遍历,逐位相加并处理进位,最后翻转结果字符串。算法通过字符转换、进位处理和字符串翻转完成二进制加法,适用于任意长度的二进制字符串输入。

2025-07-10 10:46:32 358

原创 【算法专题训练】01、整数&除法

【代码】【算法专题训练】01、整数基础知识。

2025-06-10 09:59:49 541

原创 【C++并发编程】01、初识C++并发编程

且让太多的线程同时运行,会消耗很多操作系统资源,因为每个线程都需要独立的堆栈空间,最后让操作系统运行得更加缓慢。每次任务切换都需要切换一次上下文,为当前运行的任务保存cpu的状态和指令指针,并计算出要切换到哪个任务,并未即将切换到的任务重新加载处理器装填。我们在电脑上能够边听音乐边和其他人在网上聊天就是使用了计算机的并发功能,这也叫计算机的分时系统,使用的是时间切片的技术。在单个进程中运行多个线程,进程中的所有线程都共享地址空间,当一个数据被多个线程同时访问时,需要确保数据的一致性。

2025-05-30 15:54:19 551

原创 [Effective C++]条款30:透彻了解inlining的里里外外

【代码】[Effective C++]条款30:透彻了解inlining的里里外外。

2025-04-11 17:25:25 356

原创 [Effective C++]条款29:为“异常安全”而努力是值得的

异常安全是C++编程中非常重要的概念,它确保程序在抛出异常时仍能保持数据和状态的一致性。场景:需要执行多个操作,要么全部成功,要么全部不执行。解决方案:使用copy-and-swap惯用法。3.1、使用std::exchange。

2025-04-09 19:12:29 531

原创 [Effective C++]条款28:避免返回handles指向对象内部成分

在C++中,返回指向对象内部成分的引用(handles)可能会导致封装性降低和对象空悬问题。为了避免這些问题,可以通过返回const引用来限制对内部数据的修改,从而确保只读访问。

2025-04-08 20:13:26 340

空空如也

空空如也

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

TA关注的人

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