自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第二十三天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先 235.二叉搜索树的最近公共祖先

有一点易错点,题目并没有说p和q谁的val更大,因此在if的判断中需要分别比较root->val和left->val和right->val的大小,不能主观认为q->val一定大于p->val。大体思路是有点:min记录当前最小值,双指针,pre记录前一个节点,做中序遍历,中的处理为比较min和root->val - pre->val的大小。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

2024-05-09 19:51:12 124

原创 第二十二天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树 98.验证二叉搜索树

容易有的误区:根节点是比左子树的所有的value都大,比右子树所有的value都小,而不是仅仅比左孩子的value大,比右孩子的value小。优化版本:直接在树里面,通过中序遍历(左中右)判断是否是搜索二叉树,如果是一颗搜索二叉树,通过中序遍历到的节点一定是不断递增的。但是因为二叉搜索树的特性,遍历顺序与一般的树不同,用中序遍历会大大加快搜索效率。优化:(自己写一个函数)每一层递归不重新构造数组,通过传入下标参数的改变值来控制,大大节省空间效率。终止条件:数组的长度为1,直接返回构造的节点。

2024-05-08 14:44:46 206

原创 第二十一天 | 513.找树左下角的值 112.路经总和 113.路径总和|| 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

3.与终止条件对应:终止条件判断的是当前节点是否为叶子节点,那么在上一层递归时一定要判断node->left和node->right,才不会出现空指针异常的错误。前序遍历:若node->left不为空,则累加并将node->val存入路径,进入递归。用刚刚找的中间节点的值去切割中序遍历到的数列,就可得到左子树和右子树。返回值:要返回根据中序和后序数组构造完的二叉树的根节点,故类型为TreeNode *。终止条件:如果后序数组为0,即size等于0,则return NULL。1.后序数组为0,空节点。

2024-05-07 20:06:25 266

原创 第二十天 |110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

尝试作答:遍历到叶子节点时,判断不了其是左叶子还是右叶子,所以要在遍历到叶子节点上一个节点时就进行判断,这是本题和其他二叉树不同的地方。其次,应该用后序遍历。父节点的左叶子之和就是左子树的左叶子之和加上右子树的左叶子之和。遇到的问题:在尝试解答时不知道传入参数应该怎么设置,才能讲加和不断返回给上一层。错误的点在于,自己写的终止条件,应该作为单层递归的处理才对。比较左右子树和统计左右子树高度的道理一样,都应该用后序遍历。题目:257.二叉树的所有路径。题目:110.平衡二叉树。题目:404.左叶子之和。

2024-05-06 15:04:59 143

原创 第十九天 | 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

首先理解高度和深度的区别:求高度用后序遍历(因为是从下往上去计数),求深度用前序遍历(从上往下去计数)。有一个疑惑:什么时候需要重新写递归函数,什么时候可以直接在函数里进行递归?和最大深度有本质的区别:可能会陷入一个陷阱——仅仅将max改成min,但这样找到的最大深度并不是题目所要求。或者用迭代法,借助队列或栈都可以,进行计数即可,比较简单,代码略。比较左右子树和统计左右子树高度的道理一样,都应该用后序遍历。本题也可以用层序遍历,比较简单,之前已经写过。同样,层序遍历也很简单,之前写过。

2024-05-05 14:18:44 135

原创 第十八天 | 226.翻转二叉树 101.对称二叉树

考虑遍历顺序:本题只能使用后序,因为需要不断收集左右孩子的信息返回给上一层,而前序遍历(中左右)和中序遍历(左中右)都不能做到这一点。这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次。因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果。)采用指针作为参数,通过指针修改实际变量的值,即改变指针。(用队列):和用栈大同小异,略。题目:226.翻转二叉树。

2024-05-04 16:02:07 190

原创 层序遍历

这道题目就是传统的层序遍历,只是一个节点的孩子数不一定,孩子数量为node->children.size(),孩子的节点为node->children[k]。同样借用队列,for循环遍历,但只有当i == size - 1时,将此时node->val存进result.同样借用队列,for循环遍历,每层for循环用sum记录最大值,for循环完毕后将最大值存入result。同样借用队列,for循环遍历,每层用sum求和,for循环完毕后求均值存入result。题目:107.二叉树的层序遍历||

2024-05-02 09:39:40 2

原创 第十四天 |树的递归遍历、迭代遍历、统一遍历

前序遍历:前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。因为这样出栈的时候才是中左右的顺序。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了。确定每一层递归需要处理的信息。

2024-04-29 00:07:45 324

原创 第十三天 | 239.滑动窗口最大值 347.前k个高频元素

经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。例如:对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。(因为保持了队列始终单调,只有删除的val与出口的元素相同才会有实际的操作,其他比目前窗口最大元素小,且位置在最大元素前面的元素已经被提前卷走弹出了)

2024-04-28 21:07:59 282

原创 第十一天 | 20.有效的括号 1407.删除字符串中所有的相邻重复项 150.逆波兰表达式求值

dubug了很久才改对,因为始终没有把if和else if的差别当回事,如果用if,在逻辑上当s[i] == ( [ { 时都会进行 else if(st.empty() || st.top()!所以一定返回的是false.题目: 1407.删除字符串中所有的相邻重复项。今天的题思路都是清晰的,主要看细节。尝试解答代码如下:出现访问越界问题。for做倒叙循环,故应该是i--;题目:150.逆波兰表达式求值。题目:20.有效的括号。

2024-04-27 22:14:41 136

原创 第十天 | 232.用栈实现队列 225.用队列实现栈

尝试解答:之前做过,在逻辑上没有太大的问题,此次刷题要更注重代码语言。自己还写不出代码,需要看题解。尝试解答写下如下代码,在pop和top有问题。这道题不想上面的题,之前做完印象已经不深了。两个栈来模拟,一个进栈,一个出栈。题目:232.用栈实现队列。题目:225.用队列实现栈。

2024-04-27 20:14:27 157

原创 第九天 | KMP暂时放掉,完成昨天没做完的 右旋转字符串

首先计算除去循环后,净移动多少位,将整个字符串分开为前半部分和后半部分。先将前半部分反转,再将后半部分反转,再将整体反转,得到结果。总结:先整体反转,得到想要的整体前后顺序(稳定大局),在前后两端局部内反转,得到最终的正常正确顺序。卡码网:55.右旋转字符串。

2024-04-25 22:58:04 147

原创 第八天(续)| 151.反转字符串里的单词(重要)

写完发现逻辑除了问题不满足题意:没有对字符串里的每一个单词进行切片处理,反转之后不是题目的那个意思。此时发现自己遇到了一个问题:这样操作会删除所有的空格,怎么样才能做到在每个单词之间保留一个空格呢?1.删除多余空格:快慢指针,如果快指针所指不为‘ ’,则将对应的存到满指针所在的位置。以上为本次刷题写的c++代码,一直过不了,先放一下,下面附上之前写对的c语言代码。代码里有很多细节,值得反复去做,双指针的运用也比较灵活,巧妙。题目:151.反转字符串里的单词(亟待解决)2.将整个字符串反转。

2024-04-25 22:38:13 153

原创 第八天 | 343.反转字符串 541.反转字符串|| 卡码网 54.替换数字

后来细想,其实从后向前是不会出现这种情况的,发现左右两个指针都是从右往左移动,右边的指针永远在左边指针的右边,最多和左指针重合,重合时说明此时指针的右边全是字母了。在写for循环时,只会习惯性的写i++,这时候就会出现尝试解答是的问题,就是关于如何计数,如何判断什么时候该反转的这个问题。其实这道题是每2k段处理一次,所以直接让i以步长为2k的长度去遍历,同时每次操作操作前k个,这样操作很巧妙,必须积累。其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

2024-04-24 15:42:51 302

原创 第七天 | 454.四数相加 383.赎金信 15.三数之和 18.四数之和

在两次剪枝时,收三树之和的影响,容易犯惯性的错,认为两个数相加就会更大,但没有考虑负数的情况。a遍历每一个数,b,c分别从a+1,nums.size() - 1往中间夹,记录满足条件的三元组,每有一个满足条件的三元组出现,就要进行对应的去重处理。1.用map:因为既需要key来存加和,又需要value来统计该加和出现了多少次。遇到这种题为什么会想到用哈希表:先预处理前两个数组,再在后两个数组里去查。这是从时间复杂度的考虑,两两分为n的平方,一三分为n的三次方。较三数之和而言,差异在于剪枝和去重。

2024-04-23 20:14:09 353

原创 第六天 | 242.有效的字母异位词 349.两个数组的交集 202.快乐数 1.两数之和

遍历,用target减去本次遍历到数,在set里查询是否被存入过,如果有则说明找到了这两个数,需要返回数组下标。使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。1.什么时候用哈希表:当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。1.编写函数,作为循环体的一部分,判断本次循环的数是不是快乐数。

2024-04-22 19:22:41 395

原创 第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07链表相交 142.环形链表||

题目:24. 两两交换链表中的节点尝试解答:定义两个用来遍历的指针,每次跳跃步长为2第一次的错误代码过程中的问题:1.循环体内改变节点指向时思维混乱,没有一个清晰确定的方法2.没有深刻记住一个原则,想要改变哪两个节点指针的指向,一定需要有一个指针指向他们的前一个节点。这样才能知道遍历链表时什么时候结束。

2024-04-20 08:15:33 622

原创 第三天 |203.删除链表元素 707.设计链表 206.翻转链表

cur用来遍历,作为判断条件,如果cur不为null时,还需继续将cur的指向反转。尝试:起始这到题还是有点难度的,因为还没有上数据结构的课程,对于一些本质的东西还理解的不够深刻。node是反转链表后的新头节点,应该被返回(新头结点是node而不是cur)tmp用来记录cur->next,方便cur后移。易错:while循环中要写else才能保证逻辑和语法正确。暂时先跳过,因为底层逻辑还不够清晰,没学。注意:创建dummyhead的方法。简单,只有一点注意和一点易错。203.删除链表元素。

2024-04-18 23:26:37 470

原创 第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

这样这个题在思路上就没有什么难度了。易错提醒:起始位置是一个持续的向后移动的过程,故应该用while循环移动起始位置,而是不if(如果是if则只移动一次,可能还不是最短的情况)改正后:(这种错误的原因是在栈和队列时习惯性的定义方式,在栈和队列的库函数内部会进行内存的分配,所以不会空指针异常,但在这道题这种情况需要提前分配够内存)窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

2024-04-18 22:51:40 599

原创 第一天 | 704.二分查找、27.移除元素

如果你继续用原数组的长度的话,你就会继续遍历到我们已经“舍弃的部分”(那些元素早就随着你的目标元素的删减往前移动了,剩下的都是不要的部分)。2.判断if成立后,nums[i]将会被删去,现在的nums[i]是一个新的数,需要判断是否删除,故应作一次 i--。3.根据区间的选择,确定while循环里是 < 还是

2024-04-17 16:37:47 404

空空如也

空空如也

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

TA关注的人

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