自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣 hot100 Day51

中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(left和right表示的正是在左子树或者右子树找到的LCA,递归回溯即为最底层LCA。如果在p和q在同一侧,此时left和right只有一个非空,递归将返回最底层的LCA。如果在root中没有找到p或者q,返回nullptr,可以利用此进行判断。如果p和q分别在左右子树,或者pq等于root,返回root。

2025-07-21 23:40:23 23

原创 力扣 hot100 Day50

不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。是否在哈希表中,直接得到以当前节点为终点的满足条件的路径数目。存在于哈希表中,说明存在一个历史前缀和,使得两者之差为。,确保递归返回时哈希表状态正确(避免干扰其他分支的统计)。前缀和是指从根节点到当前节点的路径上所有节点值的和。前缀和与哈希表结合,递归沿用之前路径总和的题目逻辑。记录遍历过程中所有前缀和的出现次数。​:继续搜索以当前节点为起点的路径。的路径初始出现一次(空路径)给定一个二叉树的根节点。

2025-07-20 23:56:44 178

原创 力扣 hot100 Day49

总体是分治思想,一步步构建二叉树,引入哈希表用于快速查找根节点位置。,请构造二叉树并返回其根节点。感觉很复杂,得多做几遍。

2025-07-19 23:41:09 413

原创 力扣 hot100 Day48

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。最基本的二分法,框架可以记一下。请必须使用时间复杂度为。

2025-07-18 23:50:48 192

原创 力扣 hot100 Day47

我自己尝试的做法是,递归调用,想按着先序遍历做,但由于中途会变更根节点,导致回溯时会出现问题,很难解决。将右子节点压栈,再将左子节点压栈(这样左子节点会先出栈)上面的代码中,通过栈来存放先前的节点信息,具体逻辑如下。递归也是能做的,但需要按后序遍历顺序进行,具体逻辑如下。子指针指向链表中下一个结点,而左子指针始终为。每次处理当前节点时,将其连接到前一个节点的右侧。最后将原始右子树接到新右子树的末端。展开后的单链表应该同样使用。展开后的单链表应该与二叉树。然后将左子树移到右边。

2025-07-17 23:53:44 332

原创 力扣 hot100 Day46

利用队列存放每层节点,遍历到每个节点时,弹出该节点,同时队尾加入该节点的左右节点。levelSize的设定比较巧妙,从最开始root节点逐渐推演,对应每层节点个数。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。其实就是返回层序遍历中每行的最后一个值,在其基础上小改即可。重温一遍层序遍历逻辑吧。

2025-07-16 23:40:44 476

原创 力扣 hot100 Day45

在中序遍历的逻辑基础上,维护一个count引用进行计数,与k进行对比,就能够遍历到第k小的元素。可以考虑用显式栈替换递归栈进行中序遍历,可以避免递归栈溢出,如下。,请你设计一个算法查找其中第。小的元素(从 1 开始计数)。给定一个二叉搜索树的根节点。

2025-07-15 23:27:38 168

原创 力扣 hot100 Day44

递归做法,需要保证整个左节点树都小于根节点,右节点大于根节点,所以需要传递两个极值作为范围。最直接的想法,按中序遍历排序,如果严格升序,就符合要求,能顺利实现。所有左子树和右子树自身必须也是二叉搜索树。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。

2025-07-14 23:52:34 393

原创 力扣 hot100 Day43

简单题都做不出来了。感觉二叉树水平很烂,另外花时间做做代码随想录吧。思路很简单,二分然后递归,终止条件是判断左右指针,有点像滑动窗口。需要构造辅助函数,因为原函数传递的参数不够,需要左右指针辅助。排列,请你将其转换为一棵 平衡 二叉搜索树。主要还是递归不够熟练。

2025-07-13 22:34:03 200

原创 力扣 hot100 Day42

当然里面还有一些逻辑细节,需要维护一个levelsize记录每一层个数,用队列size循环记录即可,还需要记录每一层pop的vector,在一层遍历完push进result。逻辑很简单,队列里存放根节点,每出来一个根节点,就把根节点的左右节点push进去,先进先出,这样就实现了层序遍历。(即逐层地,从左到右访问所有节点)。BFS,广度优先搜索,基本都是基于队列实现。

2025-07-12 23:12:07 275

原创 力扣 hot100 Day41

主要卡时间的地方在于,每次操作都需要更改order哈希表,这种记录新旧顺序的方法很烂。splice用于移动节点,将it迭代器移动到链表头部,且时间复杂度为O(1)官方题解是完全自己实现的双链表,这里用list更为简洁。这个代码过不了测试,超时,不过逻辑应该没问题。请你设计并实现一个满足。的平均时间复杂度运行。最优方法是使用双向链表。

2025-07-11 21:45:20 268

原创 力扣 hot100 Day40

逻辑说起来也很简单,两两合并的意思,为了方便循环,一头一尾开始合并,然后逐次减半k值。没有思考纯粹取巧,放数组里排序后生成新的链表,回去等通知版。每层的时间复杂度都是 O(N),共有 log₂K 层。请你将所有链表合并到一个升序链表中,返回合并后的链表。比较需要注意的就是k减半的计算,举例子算算就好了。给你一个链表数组,每个链表都已经按升序排列。面试该写的算法,分治归并算法。

2025-07-10 23:23:38 302

原创 力扣 hot100 Day39

res[i].resize(n),调整第。生成「杨辉三角」的前 numRows。给定一个非负整数 numRows。逻辑很简单,就是一层一层递推计算。没状态,找了个简单题。

2025-07-09 23:07:15 242

原创 力扣 hot100 Day38

需要搞清楚节点和指针的区别,指针随便定义都可以,但节点需要new Node(curr->val)这种格式进行创建,传入的是val值。代码逻辑就是先遍历一一创建对应节点,用哈希表存储对应关系,再遍历一遍把节点的关系复制一遍即可。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。

2025-07-08 22:28:43 250

原创 力扣 hot100 Day37

反转结束,需要链接反转后的头到上一轮的尾,反转后的尾继续往后指。prev,curr,next,正常反转就用到的指针,反转结束后,prev指向新头,curr指向下一轮。dummy,虚头节点,可以视为第0轮反转后保存的尾部,dummy.next将指向第一轮反转后的头部。不难得出,需要实时维护两个个指针,指向上一轮的尾和当前轮的旧头,这样才能避免链表断裂。curr_head,当前轮反转前的头,反转后的尾,最后赋值给prev_tail。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

2025-07-07 23:21:09 372

原创 力扣 hot100 Day36

主要是实时记录diameter,相当于在递归中实现了每个根节点中比较一次diameter和左深度+右深度,从而做到不遗漏。最大深度函数仍旧是递归逻辑,对于一个根节点,最大深度为max(left,right)+1。在求最大深度过程中,利用引用维护一个diameter,对应最大长度。这条路径可能经过也可能不经过根节点。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。很直观能想到和最大深度相关。由它们之间边数表示。

2025-07-06 23:27:09 124

原创 力扣 hot100 Day35

检测根节点是否对称,需要判断,其左节点与右节点值是否相等,同时其左节点的左节点和右节点的右节点是否对称,以及左节点的右节点和右节点的左节点是否对称。比较难想到的是,单独写一个函数判断两个节点是否对称。给你一个二叉树的根节点。, 检查它是否轴对称。

2025-07-05 23:59:41 191

原创 力扣 hot100 Day34

二叉树经典递归,对于任意节点,只需要处理好当前父子节点就好,这里就是将左右节点进行交换,后面的逻辑继续调用当前函数即可。翻转的定义是,对于每个节点,交换它的左右子树。一开始不是很清楚翻转的定义,无从下笔。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。

2025-07-04 23:00:14 180

原创 力扣 hot100 Day33

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。以后涉及交换节点,都把前中后各个节点都记录下,应该是比较完备的做法。这里记录了前节点,防止链表断裂,引入虚头节点,方便统一处理。难搞,自己写的总是很难处理好所有边界条件。

2025-07-03 23:47:26 178

原创 力扣 hot100 Day32

其实和上面也差不多,都是一个指针走到头,一个指针走到倒数第n位,但是并行处理了,只需一次遍历,效率更高。居然没想到,双指针,快指针领先n步,即可找到倒数n位节点。这里先遍历记录长度,然后找到倒数第n位进行删除。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

2025-07-02 23:53:12 261

原创 力扣 hot100 Day31

通过new创建新内存,引入dummy虚拟头节点方便记录,最后delete。注意边界条件的处理,只要两个链表还有数字或者还有进位,就不退出循环。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。需要注意,是逆序存储的数字,所以直接从头加起来就行。的方式存储的,并且每个节点只能存储。

2025-07-01 23:18:36 138

原创 力扣 hot100 Day30

逻辑很简单,但这里写的太冗杂了,因为要记录head,需要在head赋值后用cur复制,所以第一次判断不在循环里,很难看。这里用一个虚拟头节点,使得逻辑和格式简洁许多,最后返回时也能使用。新链表是通过拼接给定的两个链表的所有节点组成的。递归法,挺好理解的,适合面试用(估计也很难有简单题)将两个升序链表合并为一个新的。

2025-06-30 23:18:55 186

原创 力扣 hot100 Day29

根据这个可以得到,在快慢指针第一次相遇后,从head出发一个新的指针,与慢指针同一速度出发,必然相遇于环节点。无论a和c谁比较大,小的那个指针走到环节点时,另一个必然刚好比其多k圈,并相遇。m-2n-1不一定为正数,为了看着舒服,可以写为。slow走的距离为a+n(b+c)+b。fast走的距离为a+m(b+c)+b。,返回链表开始入环的第一个节点。很久没碰数学了,捯饬半天啥也没搞出来。给定一个链表的头节点。如果链表无环,则返回。

2025-06-29 21:04:13 294

原创 力扣 hot100 Day28

经典快慢指针判断是否存在环。实际上有环的话,永远无法到达nullptr,一快一慢总会相遇。,判断链表中是否有环。给你一个链表的头节点。

2025-06-28 23:10:16 206

原创 Games101 Lecture3,Lecture4

引入一个维度(无物理意义?),辅助表达平移,为零时,表示向量,不为零时,表示点(/w)本来这是对相机作做的变换,但所有物体都应该相对相机不变,所以所有物体都要跟着变换。将相机位置旋转到设定角度,对应矩阵,即将原有g旋转至-z,t旋转至y。反过来求比较方便,旋转矩阵皆为正交矩阵,求逆同样方便,转置即可。两个投影具体逻辑后面补充吧,效果感觉不符预期,不知道目的是什么。相机标准设定,位于原点,向上为y方向,指向-z方向。视图变换矩阵,先将相机位置移到原点,再设定好角度。,解决平移的特殊情况。

2025-06-28 17:14:44 151

原创 力扣 hot100 Day27

这里,先用快慢指针找到中点,比前面直接遍历计数更优雅,接着反转后半链表,将反转后的链表与前半链表对比即可。空间更省,但改变了链表,可以后续恢复。用栈其实略显麻烦,可以直接将链表数存在数组里从后到前比对,逻辑更清晰,不过懒得补充了。这里用栈存储前一半数据,后面再一一和栈里的数据进行比对,逻辑简单,需要O(n)空间。,请你判断该链表是否为回文链表。给你一个单链表的头节点。

2025-06-27 23:33:15 163

原创 力扣 hot100 Day26

逻辑很简单,先用tmp暂存下下个节点,再将下一个节点指向当前节点,最后cur和next移动即可。用pre和cur处理会更简洁,还不用额外处理第一个节点,不过本质是一样的,懒得贴了。注意要将第一个节点指向nullptr,否则就成环了。,请你反转链表,并返回反转后的链表。

2025-06-26 22:43:53 206

原创 力扣 hot100 Day25

思路很简单,先求出两个链表差值,将长的链表走过差值后,与短的一起移动,直至两者指向同一个节点或者到达边界。,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。主要还是熟悉对链表的操作。

2025-06-25 23:11:57 235

原创 力扣 hot100 Day24

右上角:往左martix变小,往下martix变大,可区分,可用。左下角:往右martix变大,往上martix变小,可区分,可用。要选择一个点,使得横向和纵向移动,martix能够有不同的变化。左上角:往右往下移动,martix值都变大,无法区分,不可用。右下角:往左往上移动,martix都变小,不可区分,不可用。在这个逻辑上遍历,就能顺利写出上面的代码来了。这种算法能在O(m+n)完成搜索,效率高。每行的元素从左到右升序排列。每列的元素从上到下升序排列。编写一个高效的算法来搜索。

2025-06-24 23:20:24 290

原创 力扣 hot100 Day23

另一种方法,用directions数组存方向信息,然后在越界时加一即可。感觉没什么特别的复杂的逻辑,但写半天没写出来。,返回矩阵中的所有元素。

2025-06-23 23:01:56 183

原创 力扣 hot100 Day22

逻辑就是,n层阶梯的方法完全由n-1和n-2两层的方法数决定,因为只有这两种可能。动态规划,相较于递归优化了很多,用三个变量轮换也节省了空间。你有多少种不同的方法可以爬到楼顶呢?

2025-06-22 23:55:04 99

原创 力扣 hot100 Day21

旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。直接旋转,也是硬找规律,可能更好找一点。先转置,后翻转,没啥说的,全靠找规律。使用另一个矩阵来旋转图像。

2025-06-21 23:40:58 211

原创 力扣 hot100 Day20

所以,将首行与首列的零情况单独用bool值存储,直到最后再进行处理,这样,用来标记的零值就不会被误判。但直接处理会出现这种情况:该行置零表示该行有零,但列处理时将这个零误视为原先的零值,导致错误。不是原地算法,利用两个数值存储各行以及各列是否有零,再遍历赋值即可。为了减少空间占用,利用首行首列存储该行列是否有零。,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。

2025-06-20 23:50:39 131

原创 力扣 hot100 Day19

符合空间要求的解法,挺绕的。逻辑在于,通过原数组存放信息,利用swap,将范围内n值存放在索引n-1处,这样,只需要找到第一个不符合要求的索引,即对应输出。因为最小的正整数,最大也就是n+1,所以这里采用哈希表存放n+1个可能结果的遍历过程,最后取最小值输出即可。空间复杂度不满足要求。为了应对重复数值,当交换两值相等时,不进行交换。,请你找出其中没有出现的最小的正整数。并且只使用常数级别额外空间的解决方案。给你一个未排序的整数数组。请你实现时间复杂度为。

2025-06-19 22:54:14 214

原创 力扣 hot100 Day18

对上面的代码进行了空间优化,首先利用result存储前缀积,然后利用一个tmp存储后缀积,同时实时更新result即可。的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组。前后遍历一遍,保存前缀积和后缀积,相乘就是所需结果。拿笔画一下就很清晰。之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。时间复杂度内完成此题。

2025-06-18 23:17:36 205

原创 力扣 hot100 Day17

三步翻转法,感觉是怎么想都想不出来的方法。空间复杂度为O(1),因为翻转只用了常数级空间。逻辑很简单,算一下就能得到规律。,将数组中的元素向右轮转。

2025-06-17 23:20:58 132

原创 力扣 hot100 Day16

逻辑简单粗暴,先按start值进行排序,维护一个tmp值,再遍历一遍判断是否更新tmp即可,最后在对应条件和结束时将tmp存进result。ai优化了一下,排序直接用sort就行,后面处理也简明了许多。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2025-06-16 23:49:56 164

原创 力扣 hot100 Day15

是指从根节点到最远叶子节点的最长路径上的节点数。递归,没啥说的,水一水。

2025-06-15 23:58:19 121

原创 力扣 hot100 Day14

正确做法是,通过dp存储以num[i]结尾的最大序列值,通过maxn存储遍历过程中最大序列值。这样,就有了dp=(max(nums[i],dp+nums[i]))的递推关系,由于dp不总是所求值,即最大和的连续子数组不总是以nums[i]收尾,所以维护一个maxn值进行记录。思考中最大的难点在于,如果用dp保存前面数组中具有最大和的子数组,不能顺利推进递推关系。思路很简单,主要是逻辑的实现,求解跨越两边的数组时,直接遍历到头,没有什么特别的。并不比dp优秀,只是展示一下分治法的逻辑。分治法,比官解清晰点。

2025-06-14 23:33:54 163

原创 力扣 hot100 Day13

这里的思路是,哈希表need记录需要覆盖的字母,在此基础上window只记录需要判断的字母个数,当window[c]==need[c]时,valid加一,即刚满足个数需求时加一,避免后续重复。当valid等于不同字母数时,即表明各个字母都满足了次数要求。通过len记录了最短时的start,最后返回即可,通过substr实现。右指针不断右移,当满足要求时,左指针右移动,直至不满足要求。主要问题点在于,如何快速判断,窗口中的字母覆盖所需字母。所有字符的子串,则返回空字符串。好难,看了提示都写不出来。

2025-06-13 23:47:14 111

空空如也

空空如也

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

TA关注的人

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