- 博客(74)
- 收藏
- 关注
原创 LeetCode.559.N叉数的最大深度
运用递归的话,就是先把一个节点的左右两侧的子树的深度算出,最大值加一就是该点的深度,对于根节点来说就是该树的深度。输入就是一个节点,单次结束的逻辑是遍历到NULL,单词递归的逻辑就是求两侧的最大深度,最大值加一为返回的深度。迭代就是利用层序遍历,每添加一层,深度就加一;这题也是用迭代和递归两个方法做。
2026-10-16 14:37:26
162
原创 LeetCode.101.对称二叉树
左右只有一边有孩子,那就是不对称的了;需要注意的是并不是左右的节点相等就是对称了,单次循环并不代表整棵树。最后就是每次循环的逻辑,对于二叉树而言,整棵树的对称是最左侧和最右侧,然后再往里一侧,这样对称的,所以我们一开始选择比较的节点很重要,需要选择左节点的左子树&&右节点的右子树,还有左节点的右子树&&右节点的左子树,这样子去完成每一次的递归。之后再按左节点的左子树->右节点的右子树->左节点的右子树->右节点的左子树的顺序来入队,如果while循环能出来的直接true没问题。依旧是使用迭代和递归来完成。
2026-10-15 14:10:13
186
原创 LeetCode.226.翻转二叉树
递归的话,观察到翻转二叉树其实就是左右子数互换,结束单层循环的条件就是遍历到空的节点了,输入只有一个根节点。迭代的话就是用栈去实现,也是交换左右子树。这题可以递归可以迭代。
2026-10-14 10:40:55
129
原创 LeetCode.199.二叉树的右视图
对比上一题就是取本层的最后一个节点,在for循环遍历中少遍历一次即可提取。简而言之就是取每层右边的第一个节点。
2026-10-12 14:12:39
52
原创 LeetCode.102.二叉树的层序遍历
我们可以给出,传递的参数有存储答案的result以及根节点,还有就是对应二维数组result的索引,也就是深度(层数);终止条件就是输入都是输入的节点是空节点;单层递归的逻辑把本节点压入对应的数组然后传递到其左右节点。其实就是用队列把根节点先入队,根节点出队的同时再入队其左右俩孩子,然后重复这个操作就可以了。根据递归的三要素:确定递归函数的参数和返回值、确定终止条件、确定单层递归的逻辑。因为答案里的分层是分成几个一维数组的,所以我们要借助vec来分层。这个是迭代的做法,还可以考虑递归的做法。
2026-10-09 12:52:17
218
原创 二叉树の迭代遍历
我们利用栈来实现遍历,前序遍历是中左右,所以越晚出现的值越早入栈,当根节点作为栈顶出栈后将其右节点入栈,再把左点节点入栈,然后遍历到作为栈顶的左节点,左节点出栈,再压入其右节点与左节点,以此反复,直到叶子节点,那么之后就把栈内的元素出战。左中右,就是需要先下到最左端的叶子节点,然后出栈,在新栈顶上(也就是刚才出栈的节点的父节点)把该栈顶出栈,然后把右节点入栈,重复以上操作。其实跟前序也没那么类似。后序遍历是左右中,也就是反转的中右左,所以我们只需要改变前序遍历的左右逻辑,最后再反转即可。
2026-10-08 16:55:52
188
原创 二叉树の递归遍历
学习一下卡哥的递归思路确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明 确每次递归的返回值是什么进而确定递归函数的返回类型。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写 的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作 系统的内存栈必然就会溢出。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
2026-10-06 14:39:55
168
原创 二叉树の一些知识
int val;哎呦我滴嘛。这个二叉树咋这么多内容。。。看来要分好几次讲基本内容了。说来也是,本人一直很害怕迭代递归什么的,云里雾里,希望这次能一口气搞明白吧。
2026-10-05 14:28:20
172
原创 LeetCode.347.前k个高频元素
对于堆的维护,比如加进来一个新的数了,需要对整个堆进行重排,这样才能保证堆的秩序,首先是新的数和其父节点对比,不断地向上对比,这样才能有序;所以大家经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。所以我们如果要找到前k个频率最高的数的话,对于大顶堆来说只会把最大值一直弹出,所以我们选择小顶堆,这样到最后我们堆中就只剩出现频率最大的几个数了。
2026-10-04 21:21:17
216
原创 LeetCode.239.滑动窗口最大值
对于这个移动窗口中的数值,要想直接获得最大值当然可以用暴力求解,但是这样时间复杂度拉太高了,或许可以把窗口中的数值排序到队列中,排一个降序,front直接就是最大值,那么移动窗口后,如果是最大值就直接出队列,如果不是最大值就不用管,有新的值可以从队列的最后依次比较,如果能比到第一个那就成最大值。这样就能把移动窗口每一次的最大值汇总起来了。
2026-10-03 14:47:11
232
原创 LeetCode.150.逆波兰表达式求值
逆波兰这个也看多了,就是依次取栈顶的两个数进行运算。考虑到用栈的数据结构即可,切记运算好的结果要重新入栈。
2026-10-03 14:06:52
255
原创 LeetCode.1047.删除字符串中的所有相邻重复项
就是用栈去遍历,碰上与栈顶相同的就把栈顶一同出栈。最后从栈变成字符串的过程可以学习一下。
2026-10-02 17:41:14
197
原创 LeetCode.020.有效的括号
通常利用栈去实现该功能,一般都是左右括号进行匹配,遍历括号组,若是左括号则把右括号压入栈,若是右括号则与栈顶进行匹配,如果匹配不上就false,如果匹配上了就把栈顶出栈,最后最后最后还要判断是否有残留的括号!
2026-10-02 17:18:30
193
原创 计算二分类模型的精确率与召回率
目前大三,计算机专业,觉得学校专业课没意义,于是一节专业课都没打算上,但是作为补充,我需要在本学期完成三到四个项目,这是作为不上课的交换,我不可能一边不上课,一边混子,这样的生活在中国会相当难受。项目都在初期,但是都搞得我很焦躁,因为都是跟着ai干的,目前没有任何产出,做一件事如果长期没有正反馈是很抑郁的,所以我打算在之后也更新一点博客内容在本账号,如果真有一天项目差不多完结了,或许我还会在b站上分享吧,这都是后话了。true来自y_true pred来自y_pred。
2026-09-29 17:20:02
181
原创 LeetCode.225.用队列实现栈
至于用队列模拟栈,就是要取到队列末尾的那个元素,使用size来遍历就行了。这道题跟上一题的目的基本类似,就是要会用这个队列内的一些操作,以及创建。
2026-09-28 11:23:42
231
原创 队列与栈の基本知识
HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。
2026-09-24 12:02:39
128
原创 LeetCode.459.重复的子字符串
首先就是创建next表,这个是kmp算法的关键,我就习惯用-1的表了,需要注意的是,在遍历模式串的时候,要先写while退回的,再写if前进的,不然到时候退回了,如果后面还有相等就没法加上,next就出错了。进入主代码,卡哥用大量的篇幅去证明一个事情,最大相等前后缀不包含的字串,如果是存在,并且是可以整除模式串的,那么这个模式串就是重复的子字符串。总结出来就是一句代码的事情,但是证明起来却需要理解良久。跟着代码随想录的思路走了一遍,使用kmp算法去解决这道题,同时巩固了kmp算法。
2026-09-23 11:07:00
171
原创 LeetCode.028.找出字符串中第一个匹配项的
这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。举一个例子:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。可以看出,文本串中第六个字符b 和 模式串的第六个字符f,不匹配了。如果暴力匹配,发现不匹配,此时就要从头匹配了。但如果使用前缀表,就不会从头匹配,而是从上次已经匹配的内容开始匹配,找到了模式串中第三个字符b继续开始匹配。
2026-09-21 14:38:14
114
原创 LeetCode.151.反转字符串里的单词
首先这个函数是移除多余空格的,分别删除的首空格,中间空格,尾空格;函数逻辑是这样的,slow指针在上个单词的尾端,i指针遍历到非空格字符时,开始先把两词之间的空格补上(如果是第一个单词的话就不用管),现在slow在本单词的首端,根据i把后续单词的字母补上;这道题采用卡哥的思路,先把多余的空格去掉,形成一个标准格式,然后再整体反转,之后再对每一个单词进行反转,这样对空间消耗得比较小。主函数,对于单词最后的反转,就根据找空格的方式就行。反转函数,没什么好说的,给定反转区间。
2026-09-18 13:34:37
41
原创 LeetCode.018.四数之和
关于剪枝处理,可以分为两类,第一个就是对于排序过后的数组,如果最小的第i个数字都要比目标和大的话,那么这个数组就没有继续算下去的必要了;其次就是对去重的剪枝,你可以把排序过后的数组想象长短不一的积木拼起来的一个长条,重复的数字都排在一起,然后你只需要取积木的最尾端即可避免重复。以上就是剪枝的大致情况,讲起来容易,但是写一遍没问题的显然还是挺复杂的。那么对于四数之和,就是在三数之和的基础上,添加上一层for循环,把abcd拆分成,ab&cd,对于cd我们来拆用双指针,然后剪枝的地方就跟三树之和没什么区别。
2026-09-15 16:26:27
202
原创 LeetCode.015.三树之和
跟之前的思路是一样的,在哈希表中就是一找一,确定好一个后,那么三元组的另外两个就合并,变为b+c,然后去集合里找0-(b+c),但是对于重复的判定稍微有些复杂,对于一层循环就是判定,是否与前一个重复,对于第二层循环就是针对,后面两个数字不要重复,这个说着简单,想到又有点复杂的。因为是在哈希表专题,所以这道题就用哈希集合的做法去做了,最后要返回一个二维数组,里面的三原组之和为零。
2026-09-14 23:46:17
124
原创 LeetCode.454.四数相加 ||
我一开始做的时候是没有加这个判定条件的,但也能通过,原因就是当mp_AB[key]不存在时,会分配内存初始化一个value为零的值,加了这个判定之后按道理来说,应该减少了这些开销,速度会更快一点,但是并没有。这道题就是讲四个数转换为两个组,再利用map,思路就跟之前的二数相加一样。所以加了还是没问题的,保险一点。有一点要注意的就是,反而速度大降,本质是。
2026-09-11 12:36:29
136
原创 LeetCode.001.两数相加
通过这道题我对emplace_back,insert的区别又更理解了。insert是插入值的,而emplace_back是插入容器的。这道题是利用map去寻找两数,边遍历边寻找两和数。pair就是可以把两个值绑定在一起。兜兜转转做回了第一题哈哈哈。
2026-09-10 14:51:18
140
原创 LeetCode.202.快乐数
这道题感觉是那种一开始学编程的算法题,但是由于循环可能重复,有重复就要想到集合,想到哈希,所以这道题也可以通过集合哈希表的做法完成。
2026-09-10 14:44:01
184
原创 LeetCode.350.两个数组的交集II
这道题就需要有重合的出现了,所以不能用set集合了,转而用map和数组都可以。这里分享一个map的做法,顺便复习一下写法。
2026-09-09 11:19:25
240
原创 LeetCode.438.找到字符串中所有字母异位词
代码是简洁了,思路也清晰,就是这个循环加上sort、substr这个时间开销太大了,导致最后运行超时。这道题沿用上一题的思路,我会这么做。移动窗口不熟悉,多想想。
2026-09-08 14:05:14
166
原创 LeetCode.049.字母异位词分组
这道题相比前两题就复杂了不少,数组记录字符出现的个数只是很小一块铺垫,我一开始不知道该怎么做想着套两层循环暴力一下,结果就是超时了,其实就是我还不熟悉哈希表的另外两种用法,一个是集合set,一个是字典map。然后是对于迭代器的类型,那么一长串,写起来十分不方便,可以直接用auto代替,也省去了思考的时间,比如for (auto it = mp.begin();这个方法可以通过,但是时间空间复杂度都很差,而且写法也不现代,所以我学习了一下官方的解答顺便学习了一下怎么写起来又有效率有不失可读。
2026-09-07 11:03:09
229
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅