自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营Day21||Leecode669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、 538.把二叉搜索树转换为累加树

难点在控制单次循环的条件,本题的控制单次循环条件是:遍历节点,如果遇到了不在区间内的点,直接返回新子树。对于新子树,再对它的左右指针进行重新赋值为函数返回值,这就相当于对子树当成新的根节点,当成新树,进行了再修剪操作了。参照之前切割数组的思路做的,一开始right数组左侧没有+1,也就没有把已经录入根节点的元素去掉,导致出错,改成加一以后就通过了。思路挺好理解的,但是想不到用一个pre来记录上节点的值,对中序遍历的理解没有那么强,这题加强了对中序遍历的理解。

2024-07-24 15:28:10 49

原创 代码随想录算法训练营Day20||Leecode235.二叉搜索树最近公共祖先、Leecode701.二叉搜索树中的插入操作、Leecode450.删除二叉搜索树中的节点

我自己第一遍的写法是根据大小关系来遍历左右子树,然后遍历到叶子节点再插入。3.父节点,俩儿子,左儿子是小儿子,右儿子是大儿子(二叉搜索树的性质)把小儿子交给大儿子 ,然后再把大儿子交给爷爷,然后删除。这题依旧是用left来接受左子树返回上来的有效节点地址,无效(遍历到叶子后也没找到p/q)则返回空。二叉搜索树独特的性质可以让我在开始就可以通过比较根节点和目标pq节点值的大小来确定遍历方向。所以在此基础上,把插入节点的操作改成终止条件。2.父节点,但只有一个儿子,把儿子继承给爷爷,直接删。

2024-07-23 15:19:46 101

原创 代码随想录算法训练营Day18||Leecode530.二叉搜索树的最小绝对差、Leecode236.二叉树最近公共祖先、Leecode501.二叉搜索树众数

控制单轮循环条件运用了双指针,在cur没有遍历到最底层的叶子节点的时候,先不给pre赋值,然后等到到了最底层开始给pre赋值为cur,达成pre和cur始终保持着相差一个节点的距离的效果。在完成对count的操作之后,再维护maxcount,maxcount的含义是如果节点的节点数达到了maxcount,此时才为众数。这里返回值类型用的是void,不用int是因为定义了一个全局变量,用来随时更改保存最小的部分,这个思路我觉得可以沿用到想要返回一个需要不断比较和更新的类型。一、二叉搜索树的最小绝对差。

2024-07-22 16:39:12 149

原创 代码随想录算法训练营Day17||Leecode654.最大二叉树、

问题出现在,只要不是左右指针都为空,就new一个新节点,这样导致,不在中间返回的话,就会出现空指针异常,如果在中间返回的话, 就只能返回new的新节点,不能再往下检索了。没有考虑到本题是中序遍历,也没有想到这题定义一个最大值来实时比较大小的方法,值得二刷。因此需要题解中,若出现一个为空,则直接return 另一个节点的指针的做法。自己写的自己debug对了 ~~~太开心了。这题学到了什么情况会触发空指针异常的报错。

2024-07-20 18:07:37 175

原创 代码随想录算法训练营Day16||Leecode513.找树左下角的值、Leecode112.路径总和、Leecode106.中序后序构造二叉树

递归三部曲:第一步 返回值类型为空,参数需要传入每次开始的节点指针,和与已存最大深度比较的depth 第二步 确定终止条件为找到叶子节点,找到后需要变更最大深度,然后用result记录当前节点的值。经过我的思考和视频讲解,我认为,首先是因为maxdepth这个变量的存在,控制了同一层的节点之间比较,然后因为先遍历左侧,然后遍历右侧,这使得在同一层的情况下,先记录的节点值一定是左侧节点的值。第三步 单层循环逻辑为左遍历:每次减去左/右节点的数,然后判断其子树返回值是否为真,然后递归后回溯。

2024-07-18 16:41:42 142

原创 代码随想录算法训练营Day15||Leecode110.平衡二叉树、Leecode257.二叉树所有路径、Leecode404.左叶子总和、Leecode222.完全二叉树节点个数

第二步:终止条件是遍历到叶子节点(判断叶子节点的方法是看一个节点的左指针和右指针同时为空即为叶子)第三步:单层循环的代码是把节点值传入path数组中,在每一轮到遍历到叶子节点时,要用to_string函数把path中的int变量变成string类型存放进sPath这个变量中,这个变量把整条路径都保存下来以后再加入到result数组中。递归三部曲:第一步 确定返回值为int,参数是传入root,第二步 中止条件:分为几种情况:是左叶子节点、是右叶子节点,是左子树的左叶子节点,是右子树的左叶子节点。

2024-07-17 20:46:27 265

原创 代码随想录算法训练营Day14||Leecode226.翻转二叉树

swap的位置就是“中”的位置,inverval(cur->left)就是“左”的位置。因为swap是针对父节点的操作,所以可以吧swap的位置等效替换成“中”的位置。深度和高度一样都是采用后序遍历,在每一层节点中,先去探索左子树的最大深度,再探索右子树的最大深度,让二者比较取一个更大值+1(+1代表遍历过了一层)这里的特殊处理有点懵,也就是说,求最小深度是遇到了nullptr要给它特殊标记,左侧如果为空,右侧依然需要算。T.T第一次自己AC了二叉树这里的题,虽然不是用递归,用层序遍历做的。

2024-07-17 10:44:33 344

原创 代码随想录算法训练营Day13||二叉树

while的条件控制为队列不为空,也就是说,所有节点都访问完了,才回出现队列为空的情况,正是我想要的条件。3.二叉搜索树:特征是,所有左子树(包括左节点)小于根节点,所有右子树(包括右节点)大于根节点。维护就是说保护一个数据结构,让它本身的性质不发生变化,以单调队列为例子,维护单调队列就是让pop的时候只删去当前的队首(最大值),push之前把队内已有元素中小于即将加入的元素先去掉,然后再加入。2.完全二叉树:特征是除了最底层可以不满,其他层都是满节点,并且在底层的节点必须是连续的。

2024-07-15 22:33:23 694

原创 代码随想录算法训练营Day11||Leecode150.逆波兰表达式求值、

这里的pop和push与标准队列不同,这里的pop的原则是:在队列不为空的情况下,传入值和已经放在队首的最大值元素相等时才弹出首元素。Push的原则是,在队列不为空的情况下,先把队内已有的,小于传入值的元素从队尾弹出,然后再从队尾插入传入值。逆波兰表达式在学习数据结构的时候看过实现过程,所以这题思路比较简单,同题解一致。本题的思路是,先把滑动窗口长度k内包含的第一组元素处理好,放入队列,然后再依次处理后续元素,让每次遍历新元素都能保证窗口k长度内最大元素在队首,并且存入result数组中。

2024-07-14 22:27:33 411

原创 代码随想录算法训练营Day10||Leecode232.用栈实现队列、Leecode225用队列实现栈、Leecode20有效的括号、Leecode1047删除字符串所有重复项

这样的问题是,如果队列中有重复的元素像用例中[1,2,2,3,4,2],temp=2,而到第二个元素就停止删除了,所以会出现错误。本题录入的方法是,如果检测到左括号,那么压入右括号,等到左括号全部检索完毕后,根据检索到的右括号和已压入的右括号进行一一比对。本题第一次尝试是开辟了三个栈,分别存放()、{}、【】,然后判断他们的大小是不是偶数来判断是否不是正确的括号,但是这个样只能判断括号数是否正确,如果存在({)}这样的次序问题就会出错。栈是单开口,队列双开口,想用栈实现队列,必须要用两个栈来才能实现。

2024-07-12 15:32:51 475

原创 代码随想录算法训练营Day09||Leecode151.反转字符串中单词、卡码网55.右旋转字符串

具体操作是,用慢指针检索尾部是否有空格(这里的空格一定只有一个,不会存在多个,因为第二步覆盖操作时已经利用continue去掉了连续的空格),如果有空格,就把字符串利用resize重新定义长度。这里有一个细节是,low指针在前面覆盖操作的时候,最后有一步low++的自增了,所以在下表中,指向的是末尾元素的后一位,因此检查最后一位是不是空格的指针是low-1指针而不是low指针。这道题涉及的知识点真的非常多,也非常有意思。第一,需要去掉多余的空格(包括开头的空格、后尾的空格、以及中间多余的空格)。

2024-07-11 19:42:18 272

原创 代码随想录算法训练营Day08||Leecode.反转字符串、Leecode541.反转字符串Ⅱ、卡码网54.替换数组

需要注意的是迭代器的使用,如果想用一个数组的头迭代器和尾迭代器还好说,直接用.begin()和.end()就行,如果想用中间某个元素的迭代器的话,就让.begin()+i。本题需要的知识点是,对现有字符数组进行扩充,用到了resize()函数,内部要求写原数组的大小加上要增加的大小。本题的思路是通过操作for循环的条件,一段一段检索字符串。每次以2k为单位长度来进行相应操作。没有很好的办法直接插入number单词,只能一个个往数组里添加。我用了双指针,首尾两个元素交换,题解用了swap()更简介。

2024-07-10 11:08:49 347

原创 代码随想录算法训练营Day07||Leecode.454四数相加、Leecode.383赎金信、Leecode.15三数之和、Leecode.18四数之和

3.在确定下标元素以后,双指针查值的时候,也要考虑去重的操作。简单的数组哈希表,我的实现思路是,把magezine这个字符串先存起来,表示可用的字母数量,然后遍历ranstomNote数组,对哈希表内的次数进行递减,最后检查哈希数组,如果出现负数,就代表着有不够用的字母,返回false,否则就返回true。今天运用的map操作和昨天相比,今天采用了umap[a+b]++直接对相同key值进行value自增,相当于一个计数器,而昨天是用map来作为一个存储工具,用的是.insert({})添加键值对的方法。

2024-07-09 21:59:29 797

原创 代码随想录算法训练营Day06||哈希表、Leecode242.有效字母异位词、 Leecode349. 两个数组的交集 、Leecode202. 快乐数 、Leecode1. 两数之和

本题的实现思路是,先将nums1数组放到一个unoderder_set中先做个去重的操作,然后用一个类似foreach的循环,找到nums2中存在数字的迭代器,并把它加到结果集合中,最后根据题目定义的vector类型,把set类型用迭代器重新赋值成vector返回。我没有找到的关键点是,只要他不唯一,就会一直循环,一直循环就会出现重复值,出现重复值就可以用哈希表。因此,这个题要先找到,一个数的各位的平方和是多少,编写一个getsum的函数,用于计算每个数字的平方和,并且用于elem元素的更新。

2024-07-08 20:36:43 559

原创 代码随想录算法训练营Day04||Leecode24.两两交换链表节点、LLeecode19.删除倒数第N个节点、Leecode.面试02.07链表相交、Leecode142.环形链表||

本题设置了虚拟头结点,如果把两个节点看成一组的话,就把cur的位置放在这一组的前面,例如0号 1号节点为一组,那么这组的前面就是虚拟头结点,cur初始位置_dummyhead,更替后,23号为一组,那么cur变成1号节点即cur=cur->next->next。对于这个题,我起初有点懵,不知道相交的概念是什么,后来想到了是二者开始存在指针相同的节点就是要返回的节点。在有环的基础上,已知快慢指针的重合点是相遇点,根据画图已知:此时令一个新的指针从起点出发,让二者相遇即是环的入口。

2024-07-07 22:55:03 673

原创 代码随想录算法训练营Day03||链表基础Leecode203.移除链表元素、Leecode707.设计链表、Leecode206.反转链表

让cur始终保持在pre的前一位,这样让cur的next指针指向pre就可以了实现了。因为cur的初始化必须是头结点,所以想让pre在cur的前一位就需要给pre赋值为nullptr,同时为了防止cur next赋值为pre后,丢失下一个节点的地址,要引入temp来保存curnext(下一个节点)的地址。1.链表的特征是定义一个结构体,每个结构体称作一个节点。对比数组,链表的插入只需要让前一个节点的next指针指向新节点,时间复杂度为O(1),查询元素需要从头结点开始依次遍历,因此时间复杂度为O(n)。

2024-07-06 16:39:52 567

原创 代码随想录Day02||Leecode977.有序数组的平方、Leecode209最小长度的子数组、Leecode59螺旋矩阵

3.当条件满足时,开始移动起始指针(缩小空间),移动的前提依然是题中所需要判断的条件,这里移动起始指针的时候,要用while来做一个持续移动的动作,而不是用if来只挪动一步。(本题的变量:length(当前满足条件数组的长度)、result(返回值)、sum(判断条件的元素)、i(起始指针))代码随想录中的判断条件直接采用了平方比较大小的方式,我采用的是用函数abs()取绝对值比较。1.想要求一个最短的长度,那么就定义一个result为最大值,反之,求最长的长度,就定义一个最小值。目前我遇到的最难的题型。

2024-07-05 22:17:54 655

原创 代码随想录算法训练营Day1||数组、二分查找、移除元素

而right如果也取开区间,right更新为mid-1,right如果取开区间,right即使等于mid也取不到mid,所以right更新为mid。1.left righ指针的范围,本题中right如果赋值为数组长度,转化成下标后就会出现越界,所以要取开区间,如果赋值为nums.size()-1的话,转成下标会正好变成最后一个元素,所以取闭区间。我是从C语言转C++的,数组在地址存放上的连续性被沿用,多了一个vector,我把他理解成为动态数组,不过现在还没有用到,还不能很好区分二者之间的差异。

2024-07-04 00:39:36 592 1

空空如也

空空如也

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

TA关注的人

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