自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode.404.左叶子之和

1.用变量result全局累加,而不是靠返回值往上传。2.每个节点进来先判空,自己的左右都空说明是叶子,它的子树里不可能有左叶子,直接返回。3.按根节点左右孩子的有无分四种情况处理:只有右孩子就只递归右边;4.只有左孩子就先看这个左孩子自己是不是叶子,是的话把它的值加进result,然后不管是不是,都递归进左边;5.左右都有的话,左边照样先判一次叶子再累加,然后左右两边都递归一次。

2026-11-11 09:25:06 85

原创 LeetCode.257.二叉树的所有路径

1.用一个共享的 path 数组记当前这条路上的节点值,每进入一个节点就先把它自己的值记进去。2.如果它左右孩子都空,说明这条路走到头了,就把 path 里的值按箭头格式拼成一条字符串,存进 result;3.不是叶子的话,有左孩子就往左递归,有右孩子就往右递归。4.递归完在函数末尾把刚刚记进去的那个值弹出来,退回到上一层,这样才能接着去走别的分支。

2026-11-10 11:10:38 188

原创 LeetCode222.完全二叉树的节点个数

完全二叉树最左链和最右链深度相同就是满二叉树,直接用 2^L-1 算;不相同就递归拆左右子树,每层加 1。

2026-11-09 14:45:39 308

原创 LeetCode111.二叉树的最小深度

虽然看起来和上次的104有一点类似,but...不可混为一旦勒!!!坑多多的!1.最小深度不能直接左右取小,因为单边子树会让 0 被当成最短路径。所以先判空2.再单独处理叶子、只有左孩子、只有右孩子这三种情况,只有两边都非空时才用 min 取小,每层加 1 递归返回。(有左没右,有右没左主要是要防止一根棍那种特例!如下图这种)

2026-11-09 14:05:40 156

原创 LeetCode.104二叉树的最大深度

其实感觉就是只要能反应过来用递归就没啥思路;算根的左子树的深度->算左子树的左子树的...就已经实在大问题变成小问题的一个过程了 同样的解法解决不同规模的一件事了,所以就用递归,故而,把这个直接把根的左子树和右子树当做两个整体(先别管下边具体咋算,反正最后我们可以的得到left/right),然后选一个大的+1,就是最大深度。

2026-11-05 17:04:11 171

原创 LeetCode102.二叉树的层序遍历

动态数组存最后结果,队列存待办节点。每轮 while 先量一下当前队列大小就是当前层数,for 循环弹出,把值收进当前层数组,再把左右孩子按顺序塞回队尾(记录下一层的遍历顺序)。队列空了就遍历完了。

2026-11-04 12:28:51 168

原创 百度一面小结

每个节点最多有两个子节点(左、右)。常见遍历:前序(根左右)、中序(左根右)、后序(左右根)、层序(BFS)。特殊类型:BST(左<根<右)、完全二叉树、满二叉树。

2026-10-29 20:51:21 270

原创 LeetCode.94.二叉树的中序遍历(迭代法)

push_back():作用于vector、deque、list这种序列容器。中序遍历的特殊性就在于,他的访问顺序和他的处理元素顺序的不同——>需要引。push():作用于stack、queue这种容器适配器。push_back():在容器尾部追加一个元素。,到叶子节点后,开始弹出,并处理元素;push():往栈顶/队尾放入一个元素。用栈先把访问顺序存起来。入指针实现节点的遍历。

2026-10-29 20:41:33 130

原创 力扣集训Day09

先用先序遍历把所有节点按顺序存进数组,再用数组把节点串成一条右链。PreOrder做先序遍历,把访问到的节点依次放进result。这样result里的顺序就是先序顺序。:遍历result,让每个节点的right指向下一个节点,left置为nullptr。这样整棵树就被拉平成一条只有右孩子的链,顺序和先序遍历一致。

2026-10-24 09:28:00 160

原创 力扣刷题小集

(1)统计频次:用遍历nums原数组,key存数组元素值,value存该元素出现次数。(2)维护大小为 k 的小顶堆(为什么选择小顶堆而不是大顶堆如下图)(后边出面试常考的时候在细细说topK问题的时候仔细说这个)(3)组装result:依次取出堆顶元素的key(nums[i]),倒序填入结果数组返回。

2026-10-23 17:58:47 195

原创 飞书-游酷盛世AI一面复盘

三、有哪些细节需要着重注意的?1.针对岗位恶补一点基础知识:3D数学、图形学这种。(根据具体的岗位要求决定补啥,没有的话就随缘吧)2.像行为题这种直接有一套固定说法,不要临时现想啊,感觉自己简直不知道在叽里咕噜说什么,最好就是,大概想一想说哪一件事,怎么说。(这个后续整理一下固定框架出来)3.最好可以说一口略微标准的普通话练一下自己这个川谱普通话。。。。。有点太招笑了。。。。。。。。。。4.回答项目/行为题要闭环:我咋做的->最后做了啥,成品成品成品啊!!!!

2026-10-22 09:17:34 215

原创 力扣集训Day08(递归篇)

中序遍历的逻辑中加上:当前值-上一个值即可。二叉搜索树中序遍历是有序的,最小差值一定出在相邻节点之间。所以代码一边中序遍历,一边用pre记录前一个节点的值,每次算当前节点和pre的差,取最小值就行了。

2026-10-21 21:27:44 183

原创 LeetCode20.有效的括号

(1)用栈匹配括号:奇数长度直接false(2)遇左括号压对应右括号;(这样的话后面出栈就可以直接和对应的括号比啦 更方便)(3)遇右括号,栈空或栈顶不等则false,相等就弹栈。遍历完栈空则合法。

2026-10-18 18:32:24 156

原创 力扣集训Day07

这个题主要难点就在于思路了 口述太抽象了 (每个字符靠前后同字符圈出安全区,左选法 × 右选法,全部贡献相加。) 想了点办法可视化跑一遍给大家(以LEETCODE为例),如下:.小注:安全区 = 让这个字符保持「唯一」的子串范围。

2026-10-16 21:20:11 102

原创 LeetCode.18四数之和

排序+两层循环分别固定a、b,剩下的c、d用三数之和里用到的双指针法进行去重。

2026-10-12 21:03:58 146

原创 LeetCode.454四数相加+LeetCode15.三数之和

1.题目的元素是以数组的形式存储的——不需要去重:因为不同下标的相同值也可以当作不同元素处理,所以还需要统计元素出现的次数(因为要知道最后到底有多少个元组的和为0嘛)——>选择map2.对求和步骤进行一个拆分:先两个两个加(复杂度:2*n^2约等于n^2),再把两个加完的结果加一起。(如果直接算四个数的和的话 时间复杂度太高了,n的4次方)

2026-10-11 17:50:02 127

原创 力扣集训Day06复习(哈希表)

1.提取题目关键字:次数——所以我们选择map这个哈希容器,而且题目不要求最终按照输出结果的顺序,所以直接使用遍历nums2,每遇到一个数字,如果map里存在该数字(这里的思路和349雷同,就不再细说了)

2026-10-11 17:01:33 150

原创 LeetCode349.两个数组的交集

1.审题:元素唯一->需要去重->所以用set2.核心解题:将以nums1先存入nums哈希表中->将nums2的元素与之进行对比(相等的放进result集合,不等的不放)

2026-10-09 18:22:11 291

原创 力扣集训day05

(主函数()),归并的思路最难的就是这总地方了,想想想🤔💭,上图!(mergeTwoList()),这个其实是很简单的合并两个有序链表的写法,两两比较,小的放进去,都不用新申请空间。(merge()),拆到拆无可拆,也就是左右边界重合为止,至于l>r这种情况,是用来判断空链表这种特殊情况的。:将两个已经有序的子数组,用双指针合并成一个有序数组。(1)时间复杂度:O(nlog n),是稳定排序。(3)逐层向上合并,最后整个数组有序。-核心思想:先拆分,后合并。(2)空间复杂度:O(n)

2026-09-23 21:04:34 473

原创 力扣集训day04

小复习三目运算符条件成立 → 取表达式 1条件不成立 → 取表达式 2先连成环,然后找断点,断开环即可。LCR 023.相交链表双指针分别从A、B链表头出发,走到末尾就切换到另一条链表头部继续走;两指针相遇时,就是相交节点,返回该节点。虽然有点粗糙,但是把他俩走的路拉直了就是这么个意思,如果没有共区域的话,说明没有相交的地方。

2026-09-21 18:31:24 133

原创 力扣集训day03

这个题的解法就是非常简单的快慢指针,不过这次我们不用不同速度的两个指针。题目要求的是返回倒数第k个节点,那么我们就让快指针fast比慢指针slow先走k步,那么当快指针fast到达链表末尾的时候,此时slow正好位于倒数第k个节点,直接返回slow即可得到倒数第k个节点。

2026-09-17 12:42:55 278

原创 力扣集训复习day02

1.从左下角出发(右上和左下是一样的,都可以奥,只是移动的时候需要改变一下方向,为什么会选择左下/右上角会在二叉搜索树的知识点进行解释)true2.注:虽然题目中说了是m*n的二维数组,但是并没有第一行的变量里给出哦,所以不可以直接把m/n当作二维数组的行列直接使用,依旧需要用plants[0].size()进行描述。

2026-09-12 20:58:24 407

原创 力扣集训复习day01

循环终止条件(只是一个虚拟位置,不存在真实的数据,所以不能写*s.end(),否则会报错崩溃)4.查找。

2026-09-10 19:17:04 461

原创 LeetCode242.有效的字母异位词

1.其实听到卡尔老师讲这种思路的时候,我第一反应是基础排序里的计数排序,感觉思想有相通之处。:只有小写 26 字母,直接用大小 26 数组做哈希,下标代表字母,值代表出现次数。如果 s、t 是字母异位词,每个字母加、减之后数组全部为 0,反之亦然。2.什么时候用哈希法,什么时候用数组法?

2026-09-08 21:19:37 84

原创 LeetCode.142环形链表||

1.怎么才能把环判断出来?快慢指针~如果快慢指针最终相遇了,则说明该链表有环存在~2.咋能找到环的入口?根据快慢指针走过的距离的关系可以得出:2s=2(L+x)=L+x+nC,化简一下-> L=nC-x;约等于:从相遇点往前走 (nC-x)步,就刚好到达环入口。这不就是说index1=index2相等嘛~

2026-09-06 19:03:41 11

原创 LeetCode19.删除链表的倒数第N个结点

利用快慢指针实现对链表的遍历,解决链表无法定位“倒数第N个结点”的痛点,因为当快指针到达链表末尾的时候,慢指针正好位于要删除的结点的前一个~我们直接一个 slow->next=slow->next->next;就可以实现删除操作啦~至于虚拟头结点的存在,是为了避免链表只有一个结点的情况,这样的话就不需要特殊讨论了,有个dummyhead比较方便统一写代码~1.为啥会出现多出来的一行fast=fast->next?让fast实际比slow多走n+1步,因为最终我们的slow其实是在被删除结点前的位置哦~

2026-09-05 16:49:15 215

原创 LeetCode24.两两交换链表中的节点

因为在本题中,head会发生变化,如果没有虚拟头结点的话,我们就总是需要单独去记录新的头结点,很麻烦,所以直接新申请一个虚拟头结点,这样的话,所有的头结点,都可以用dummy->next代替,就非常方便啦~还有一个原因就是因为有了虚拟头结点后,所有的两两交换操作也会变得统一,不再需要分类讨论,这也是一个优势哦。不存的话,cur->next、cur->next->next方向刚调换,cur->next就找不着了。如果节点存储了 1000 字节的数据,交换值就要拷贝 1000 字节,开销很大。

2026-09-04 17:09:35 182

原创 LeetCode206.反转链表

2.每一轮具体调换的过程如下:用temp临时保存一下cur->next的值,然后调换指向,(此时链表指向已经反转了哦),然后把这个时候的cur的值赋给pre,然后cur向后移动,此时完成一轮的反转啦!1.反转链表反转链表,重点肯定就是在反转上咯,所以这里主要设置了两个指针cur、pre,用来存储当前位置的值和当前位置前面的值。刚好停在原链表最后一个结点,也就是反转之后新链表的头结点,返回。3.直到cur=NULL的时候,循环结束,反转也就结束。图示:(有点小潦草(艹皿艹 ))(这里只画了一轮得)

2026-09-03 14:13:36 216

原创 LeetCode707.设计链表

5.删除第n个节点:先进行边界判断, cur 从虚拟头出发,停在待删除节点的前一个节点。虽然看起来题目有点吓人奥,但是其实就是五件事,查询第n个节点的值、头插、尾插、在第n个节点前插入一个新节点、删除第n个节点。2.头插:创建新节点,新节点next指向原来的第一个的真实结点,虚拟头结点的next指向新节点,完成√。出发,向后行进index步,停在要插入的位置的前一个结点,使cur->next指向新节点。4.在第n个节点前插入一个新节点:先进行一下边界判断,避免不合法的index,cur从。

2026-08-21 17:27:28 155

原创 LeetCode203. 移除链表元素

通过观察一下题目给出的链表结构可以知道,该链表是不带虚拟头结点的,所以如果当删除的val和头结点所存储的值相等的时候,就需要和普通的情况单独进行讨论(头结点前边没结点,不能像其他结点那样把他跳过了,然后就删了如下图所示)if只会判断一次,如果这个链表里边有好多个val的话,它就删一次就结束了,但是while会一直删到val没有了为止。删头结点(如图,没有虚拟头结点的话,我们需要找个临时地,暂存一下,然后给他删了,所以删除头结点执行的操作和其他位置的不一样,需要分开进行讨论)2.记得delete~

2026-08-20 17:34:44 208

原创 LeetCode59. 螺旋矩阵 II

就是很奇怪的感觉,当然,也可能是错觉。写的时候发现了一个比较严重的问题,就是一定要随时随地清晰自己对于处理问题得边界,时刻谨记,我到底是左闭右开还是左开右闭来着,不然写着写着就乱成毛线球了,下次写的时候把这个标红写在旁边提醒自己!然后就是对于offset这种拿捏不准到底要不要再减一个1的时候就直接代入法吧,别臆想法了,挺难为自己的,实在懒的话输出一下也行。通过观察可以得知,顺着图中的箭头,数值之间逐渐递减,所以完全可以顺着这个思路写下去,一共四条边,我们分四种情况进行讨论就OK啦。

2026-08-19 17:57:12 24

原创 LeetCode209长度最小的子数组

写代码不仅仅要考虑思路的简便,暴力求解固然简单,但是在实际应用中,时间复杂度和空间复杂度的成本也应该在考虑范围之内,毕竟我自己要是老板的话,当然还是希望最小成本完成同样工作量。用俩指针当子数组的头尾?细枝末节的东西也不要忽略,尤其是if/while这种小细节,如果在实战中这两者混用的话,感觉后果还是蛮严重的,总感觉前两天linux的课上也讲过来着,但是也听的不是特别明白,没事,马上找豆包老师在恶补一下。,卡尔老师讲的是,如果换成if的话就只能判断一次?代码中的while,只能是while,不可以改为if。

2026-08-16 15:12:42 198

原创 学习记录:LeetCode27移除元素

今天这个题卡尔老师讲得依旧是双指针的思路,感觉很巧妙啊,双指针的用法好广泛,突然想到之前学的快慢指针算不算也是双指针的一个变体?解题大致思路就是从最值入手,最值(即使是有负数的情况)只可能出现在数组的最左端或者最右端,故而我们设置两个下标,从数组的左右两端开始往中间进行“行进”,每一轮,选出“最大的”哪一个,放进新的数组里。注:index(新数组的下标)的值要从最大下标开始,因为我们是不断从左右两端选出“最大值”,然后往数组里面放,然后题目的要求是要得到一个非递减,也就是递增得数组。

2026-08-13 15:17:36 187

原创 数据结构-链表

这个依旧主要记录做题碎碎念以及各种自己觉得比较重要和容易忽略的地方,较为重要的我自己会标红,主打一个分享一下做题过程和做题回顾复习的作用。如果大家有什么特别好解题思路可以提出奥,欢迎讨论,我的答案大概率就是自己脑瓜子一转想,或者不会然后问问豆包找找视频,反正就想招吧。OK,进入正题!

2026-07-20 20:46:04 172

原创 字符数组+自定义结构体

return;

2026-07-20 15:14:01 155

原创 C语言学习(数组篇)

的二维数组,maxx作为解题的关键,应当注意迭代赋值,而不是单纯的比较。且初始值也不能和一般的最大值一样赋值为第一个值,而是根据题目中的要求,赋值为8,写的时候把第二次循环条件写错了写成i=0了,以致于在VS跑的时候示例可以出结果,但是OJ的时候没有过。,定义的时候,无返回值 void +函数名(定义一个变量),在主函数里引用的时候函数名(常量)。一开始写的时候陷入了一个思想误区,想着转置在设置一个数组,写完发现简直多此一举,结论:下次在VS能跑出结果,但是VS过不了的时候,检查一下循环/判断的边界条件。

2026-07-13 20:14:58 260

空空如也

空空如也

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

TA关注的人

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