自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 21 . 字母异位词分组

本文介绍了一种使用哈希表将字母异位词分组的高效解法。核心思路是通过将每个字符串排序后的结果作为哈希键,将具有相同字母组成的字符串归为一组。具体实现步骤为:1)遍历字符串数组,对每个字符串进行排序生成键;2)将原始字符串存入哈希表对应键的数组中;3)最后将哈希表中的所有值转换为二维数组返回。该方法时间复杂度主要取决于排序步骤,为O(nklogk),其中n是字符串数量,k是字符串最大长度。完整代码展示了如何利用unordered_map实现这一分组逻辑,最终返回符合要求的二维字符串数组。

2025-12-17 20:24:40 496

原创 第四周算法清单

博主决定调整博客更新方式,改为每周集中发布算法学习清单,包含6道经典题目(括号匹配、股票买卖、爬楼梯等),强调动手实践的重要性,建议读者沉浸式练习。

2025-12-13 10:56:33 406

原创 20 . 多数元素

摘要:本文介绍了如何找出数组中出现次数超过一半的多数元素。首先提出基于哈希表统计的常规解法,时间复杂度O(n)但需要额外空间。随后通过排序优化,发现排序后多数元素必然位于数组中间位置nums[n/2],从而将解法优化为O(nlogn)时间复杂度和O(1)空间复杂度。最终给出简洁的排序后取中间值的两行代码实现,满足了题目进阶要求。文章还讨论了极端情况下的数学证明,确保解法的正确性。

2025-12-13 10:42:42 897

原创 19 . 只出现一次的数字

本文介绍了两种在非空整数数组中找出唯一出现一次元素的方法。第一种使用哈希表统计元素出现次数,时间复杂度O(n)但需要额外空间;第二种利用异或运算的特性(a^a=0,a^0=a),通过遍历数组将所有元素异或,最终结果即为唯一元素。这种方法满足O(n)时间复杂度和O(1)空间复杂度要求,是更优解。文章提供了两种解法的完整代码实现,并建议读者动手实践。

2025-12-13 09:47:06 563

原创 18 . 杨辉三角

本文介绍了如何生成杨辉三角的前numRows行。杨辉三角的每个数是其左上方和右上方数的和。解题思路是初始化二维数组,首行单独处理为1,后续每行首尾置1,中间元素通过上一行相邻元素相加得到。关键点包括:二维数组初始化、行内元素位置关系处理,以及通过双重循环构建整个三角结构。最终代码简洁高效,时间复杂度为O(n²)。作者还分享了模拟题的解题技巧:多画图、多练习,将动态过程转化为代码实现。

2025-12-10 23:20:05 357

原创 17 . 爬楼梯

摘要:爬楼梯问题要求计算到达n阶台阶的不同方法数,每次可爬1或2阶。解析三种解法:1)基础递归法(时间复杂度高);2)备忘录优化的递归法,通过存储中间结果避免重复计算;3)动态规划法,自底向上构建dp数组,其中dp[i]=dp[i-1]+dp[i-2]。三种方法的核心思想都是将问题分解为子问题,利用斐波那契数列特性求解。最优解法动态规划的时间复杂度为O(n),空间复杂度可优化至O(1)。(149字)

2025-12-10 23:11:34 407

原创 16 . 买卖股票的最佳时机

本文介绍了解决股票买卖最佳时机的两种算法。第一种使用双指针法,通过维护买入指针i和卖出指针j,在遍历过程中动态更新最大利润profit和最小买入价i。第二种优化方法通过记录最小价格minPrice和最大利润maxPrft,在一次遍历中同时更新这两个值。两种方法时间复杂度均为O(n),空间复杂度O(1)。作者建议初学者优先掌握双指针法的逻辑思路,熟练后可选用更简洁的优化写法。关键在于理解动态更新最小买入价和最大利润的核心思想。

2025-12-09 18:11:28 842

原创 15 . 有效的括号

摘要:本文讲解如何判断由括号组成的字符串是否有效。有效字符串需满足:括号成对出现且顺序正确。使用栈数据结构,遇到左括号入栈,遇到右括号则检查栈顶是否匹配。若栈空或不匹配则返回false,遍历结束后栈空则返回true。时间复杂度O(n),空间复杂度O(n)。完整代码展示了栈的巧妙应用,能有效解决括号匹配问题。

2025-12-08 20:28:19 851

原创 “周末行测”——周测3_5道行测(附题目解析)

本周行测出炉 ///////

2025-12-06 19:51:45 850

原创 14 . 搜索插入位置

本文介绍了如何在有序数组中用O(logn)时间复杂度查找目标值或插入位置。通过二分查找算法,每次将搜索区间折半:比较中间元素与目标值,若相等则返回索引;若目标值较小则搜索左半区间,否则搜索右半区间。关键点在于维护左闭右开区间[start,end),当start==end时终止循环,此时start即为目标值应插入的位置。代码简洁高效,完美满足题目要求。

2025-12-05 14:53:28 626

原创 13 . 将有序数组转换为二叉树

本文介绍了如何将严格递增的有序数组转换为平衡二叉搜索树。关键思路是利用数组的有序性,采用递归方法不断选取区间中点作为根节点,从而保证二叉搜索树的性质和平衡性。具体实现中,通过递归函数dfs处理左右子区间,当区间无效时返回nullptr。为简化参数传递,将原数组存储为类成员变量。最终构建的树满足左<根<右的关系,且左右子树高度差不超过1。该方法避免了复杂的旋转操作,直接利用数组特性高效构建平衡二叉搜索树。

2025-12-04 16:00:16 1073

原创 12 . 二叉树的直径

该题要求计算二叉树的直径,即树中任意两节点间最长路径的边数。解法核心思路是递归计算每棵子树的左右深度之和,并更新最大直径。优化方法通过一次递归遍历同时计算深度和直径:在递归函数中记录当前节点的左右子树深度,计算当前直径(左右深度和)并与全局最大值比较更新。最终返回全局最大直径即可。时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。

2025-12-03 16:18:28 588

原创 11. 对称二叉树

【摘要】本文解析了如何判断二叉树是否对称的问题(LeetCode 101题)。通过递归方法,核心思路是设计辅助函数_isSymmetric(),比较两棵树的对称性:1)根节点值相等;2)左子树与右子树镜像对称。递归终止条件为两树同时为空返回true,任一为空或值不等返回false。主函数通过比较根节点的左右子树启动递归过程。代码实现简洁高效,时间复杂度O(n)。文章强调理解递归核心任务和终止条件的重要性,并推荐相关递归学习资料。

2025-12-02 19:44:24 642

原创 10. 翻转二叉树

摘要:本文讲解如何翻转二叉树(LeetCode 226题)。通过递归方法实现:1)递归出口判断空节点;2)交换当前节点的左右子树;3)递归处理左右子树。核心思路是对每个节点进行左右子树交换操作,时间复杂度O(n)。提供完整C++代码实现,使用TreeNode结构体表示节点。该方法简洁高效,适合二叉树翻转问题。

2025-12-01 17:22:38 582

原创 “周末行测”——周测2_5道行测(附题目解析)

摘要:本文包含五道逻辑推理题目的解析。第一题关于封建社会的避讳制度

2025-11-29 15:03:19 1272

原创 09 二叉树的最大深度

本周算法解析完成:本文介绍了如何计算二叉树的最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点数。文章采用递归方法解决该问题:递归的核心任务是比较左右子树的深度,返回较大值加1(当前节点);递归出口是当节点为空时返回0。最终给出简洁的C++实现代码,时间复杂度为O(n)。通过这个经典例题,可以帮助理解递归在树结构中的应用。

2025-11-28 19:07:57 240

原创 08 二叉树的中序遍历

本文介绍了二叉树中序遍历的两种实现方法:递归法和迭代法。递归法通过定义辅助函数_inorder实现,利用输出型参数优化性能;迭代法使用栈模拟递归过程,按照"左-根-右"顺序访问节点。文章详细分析了两种方法的实现思路,包括递归的终止条件、核心任务分解,以及迭代法中栈的使用逻辑。特别强调了迭代法的核心思想:遇到节点先压栈,优先处理左子树,出栈时访问节点后再处理右子树。通过约会路线类比帮助理解遍历过程,并提供了完整的C++实现代码。

2025-11-27 21:59:32 1241

原创 07 合并两个有序链表

本文介绍了合并两个有序链表的两种方法。迭代法通过创建虚拟头节点,使用双指针比较节点值,将较小节点依次链接到新链表,最后处理剩余节点。递归法则通过比较头节点值,将较小节点作为当前节点,并递归处理后续节点。两种方法时间复杂度均为O(n+m),空间复杂度迭代法为O(1),递归法为O(n+m)。代码实现展示了两种解法的具体操作步骤。

2025-11-26 19:58:53 1179

原创 06 环形链表

本文介绍了两种判断链表是否有环的方法。方法一使用哈希表unordered_set存储遍历过的节点地址,通过检查地址重复来判断是否存在环,时间复杂度O(n),空间复杂度O(n)。方法二采用快慢指针技巧,快指针每次走两步,慢指针每次走一步,若有环则两者必定相遇,时间复杂度O(n),空间复杂度O(1)。两种方法都给出了完整代码实现,其中快慢指针法更符合题目要求的O(1)内存限制。文章还详细推导了快慢指针相遇的数学原理,证明两者在环内必然相遇。

2025-11-25 20:18:33 611

原创 C++11: 传右值引用和传左值引用_结合理解与辨析

本文分析了C++中拷贝构造和移动赋值的实现原理。对于拷贝构造string a=b,形参s是左值引用,与b共享内存地址;对于移动赋值a=addstring(),形参s是右值引用绑定临时对象。特别指出移动赋值函数中返回this时,由于this是左值会触发拷贝构造,造成不必要的对象复制,正确做法应使用引用返回。通过swap实现资源转移后直接返回引用可避免额外拷贝,提高效率。

2025-11-25 01:57:26 458

原创 05 回文链表

判断单链表是否为回文链表有两种解法:1.暴力解法:遍历链表将节点值存入数组,用双指针从首尾向中间比较元素是否相同,时间复杂度O(n),空间复杂度O(n)。2.优化解法:使用快慢指针找到链表中点,反转后半部分链表,然后比较前后两半链表的值是否相同,时间复杂度O(n),空间复杂度O(1)。两种方法都能有效判断链表是否为回文结构,后者在空间复杂度上更优。

2025-11-24 18:10:32 901

原创 “周末行测”——周测1_5道行测初试水(附题目解析)

本文分享五道行测题目及解析,涵盖逻辑判断、选词填空等题型。第一题通过"搭桥法"分析儿童分类实验的假设前提;第二题选用"观照解读"准确描述纪录片对苏东坡的呈现;第三题通过画图法分析员工评优奖项的分配逻辑;第四题区分"不止"与"圣地"的用法差异;第五题用图示法排除关于飞车协会会员的干扰选项。解析过程展示了排除法、假设验证等解题技巧,帮助读者掌握行测答题思路与方法。

2025-11-22 14:59:23 854

原创 4. 反转链表/翻转链表

本文介绍了反转单链表的两种方法:迭代法和递归法。迭代法使用三个指针(prev, cur, pnext)逐步反转链表节点指向,时间复杂度O(n),空间复杂度O(1)。递归法则通过函数调用栈实现反转,每次递归处理当前节点与前驱节点的连接,时间复杂度O(n),空间复杂度O(n)。两种方法都能有效解决问题,迭代法空间效率更优,递归法则代码更简洁。文章详细分析了两种解法的实现逻辑和边界条件,并提供了完整的参考代码。全文2636字,阅读约9.4分钟(+思考成本)

2025-11-21 12:23:37 547

原创 3. 相交链表

为何相交链表如此遍历,就能保证curA和curB一定会相遇?——附上总结和参考代码

2025-11-20 18:38:53 722

原创 2. 移动零

摘要:本文介绍了两种原地移动数组零元素的方法。第一种双指针法通过交换元素,在一次遍历中将非零元素前移并保持相对顺序;第二种方法分两步,先收集非零元素再补零。双指针法更高效,时间复杂度O(n),空间复杂度O(1)。两种方法都满足题目要求,适用于需要保持非零元素顺序的场景。

2025-11-19 19:29:42 753

原创 1. 两数之和

【两数之和问题解法】本文介绍了两种解决两数之和问题的方法:1. 暴力解法(时间复杂度O(n²)):通过双重循环遍历数组,外层找第一个数,内层找匹配的第二个数。2. 哈希表优化解法(时间复杂度O(n)):利用哈希表快速查找特性,通过边存边查策略,只需一次遍历即可找到符合条件的数对。重点阐述了哈希表的应用思路,包括避免重复元素的处理技巧,以及如何通过仅存储已遍历元素来优化查找过程。

2025-11-18 14:35:18 743

原创 C++_Bug:现代写法拷贝构造中 swap 写法之小坑

本文剖析了在实现链地址法HashTable时,使用std::swap进行赋值拷贝操作时出现的递归问题。作者最初采用现代swap写法实现赋值运算符,但在测试时发现程序崩溃。通过分析发现,std::swap默认实现会导致递归调用赋值运算符,同时产生不必要的深拷贝。

2025-11-16 15:49:35 542

原创 Bug:红黑树封装成set,发生: error C2440: “return”: 无法从“std::pair<RBTreeIterator<T,T &,T *>,bool>”转换为“std::pair

封装红黑树时,迭代器类型不匹配——分析 + 解决

2025-10-15 01:32:05 838

原创 哈希_快速理解Java的HashMap用 2 的幂次方作为容量,取得的hash值也可以减小冲突?

其实刚开始读者在学习数据结构——哈希表这一节的时候,不少参考书都是建议:“尽量取不太接近2的整数幂次方的质数作为哈希表的大小。”真正的实践却是灵活——JavaMap此处的做法无疑是打破这句规则,“看似毫无章法,往往背后却是严谨的逻辑”,此处亦是如此。

2025-10-14 03:22:06 526

原创 Bug:红黑树实现中为什么没有对grandparent结点进行判空?

本文探讨了红黑树插入操作中的一个细节问题:在处理节点颜色调整时,不需要显式检查祖父节点(grandpa)是否为空。作者通过分析红黑树的基本规则(根节点必须为黑色、红色节点不能连续出现)推导出:只要当前处理的parent节点是红色,其祖父节点必定存在且非空。这解决了作者原先对可能出现的空指针解引用问题的担忧,说明在红黑树插入操作中,当parent为红色时,grandpa节点必然存在的逻辑正确性。

2025-10-10 01:45:35 653

原创 C++_继承与多态双双环绕,虚函数若被private限定,多态执行的函数又是谁(2/2)

摘要:题目考察C++中虚函数的访问权限与多态行为。当基类指针指向派生类对象时,虚函数调用权限由指针的静态类型(基类)决定,而实际执行则由动态类型(派生类)决定。虽然派生类B将虚函数f()设为private,但由于基类A中的f()是public,通过A*调用f()能编译通过,运行时仍会调用B::f(),输出"B::f()"。因此正确答案是A。访问权限检查在编译阶段进行,不影响运行时的多态行为。

2025-10-02 01:02:40 627

原创 C++_继承与多态双双环绕,正确理解“派生类怎么‘继承’基类的成员函数”(1/2)

一道经典面试选择题——综合继承和多态场景,正确理解怎么继承、调用成员函数(排除静态成员函数)。

2025-10-01 23:59:29 490

原创 String算法提升_2/9:415. 字符串相加

本文介绍了如何在不使用内置大整数库的情况下,通过字符串形式实现两个非负整数的相加。算法采用双指针从字符串末尾开始逐位相加,处理进位后将结果存入字符串,最后反转得到正确顺序。具体步骤包括:初始化双指针指向个位、逐位处理(越界补0)、计算总和与进位、处理剩余进位,最终反转结果字符串。该方法模拟了手工加法过程,适用于大数相加场景。时间复杂度为O(max(n,m)),其中n和m为输入字符串长度。

2025-09-24 21:48:05 908

原创 String算法提升_1/9:LCR 192. 把字符串转换成整数 (atoi)

本文实现了一个将字符串转换为32位有符号整数的函数myAtoi。

2025-09-22 23:17:56 950

原创 Linux:初登录与基本用户管理

本文介绍了Linux服务器登录与用户管理的基本操作:1)通过SSH以root身份登录服务器;2)使用whoami查看当前用户;3)用户管理包括创建用户(adduser)、设置密码(passwd)、验证用户(id)和删除用户(userdel -r)。特别强调用户名规则:仅限小写字母、数字和下划线,不能以数字开头或包含大写字母。文章最后预告将介绍Linux基本指令。

2025-09-21 12:45:25 304

原创 在不崩程序下,为何循环次数莫名少了?一个resize()函数引发的编程思考

文章记录了在实现string类resize()函数时发现的一个隐蔽bug。亦是string类模拟实现的“惊喜”番外篇

2025-09-20 19:04:01 700

原创 String模拟实现全代码(含测试代码)

学习string的三件套之一——模拟实现

2025-09-20 15:20:17 735

原创 C++:string模拟实现中的赋值拷贝函数现代写法诡异地崩掉了......

年轻的自己的bug,沉淀后来改果然是效果不一样(bushi,当然没改出来就很尴尬了

2025-09-15 23:34:59 1266

原创 继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到

编译器:你骗得我好苦,但你没调用,也无伤大雅。但你一旦调用,我让你编不过去。不开玩笑了,这就是模板“按需实例化”——只有被真正用到的模板成员(包括成员函数、成员类、基类子对象)才会被实例化;没被调用的成员,编译器连看都不看。本章浓缩☕:依赖模板参数T成员/函数编译器的延后检查、按需实例化

2025-09-15 00:01:38 736

原创 报错:未调用原型函数(是否是有意用变量定义的?)

本文通过一个C++模板特化的案例,揭示了对象定义与函数声明的语法陷阱。作者在测试类模板特化时,发现无参构造对象时使用Data<int,char> d();的写法实际上被编译器解析为函数声明而非对象定义。文章通过对比Data<int,char> d;的正确写法,结合普通类A的示例,强调基础语法的重要性。总结指出:不带括号的写法才是正确的对象定义方式,提醒开发者要牢固掌握基础语法知识,避免此类常见错误。

2025-09-13 01:24:15 622

空空如也

空空如也

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

TA关注的人

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