- 博客(16)
- 收藏
- 关注
原创 二叉树part05
想法是在判断如果这个节点发生了空指针的引用,在之前判断的时候就在这个位置新建一个节点。即左子树的节点值一定全部小于根节点,右子树的节点值一定大于根节点。但是二叉搜索树是要求左子树的所有节点都要小于根节点。将根节点左侧和右侧分别设为根节点的左右子树的节点。然后根据分好的左右子树序列再去构造新的最大二叉树。本题一大误区就是仅去比较根节点和左右节点的大小。这里先把给定数组的最大值作为二叉树的根节点。想法为用一个新的二叉树去接收合并后的二叉树。由于二叉搜索树的节点都是有序的。右子树的所有节点都要大于根节点。
2026-01-03 20:36:47
239
原创 二叉树part04
也需要在遇到叶子节点,判断后进行回溯,层数-1,和减去当前节点的左叶子节点或右叶子节点的值。每层递归逻辑:根据层数,找到层数的最大值 中的叶子节点 +回溯层数遍历左右节点。也是先根据前序遍历序列的第一个元素去分中序序列,再根据分好的中序序列分前序序列。注意此时左右节点的second要加入当前节点的val和左/右节点的val。后序序列的最后元素是根节点,根据根节点将中序遍历序列分成左右子树序列。参数和返回值:参数就是当前遍历的节点,和当前的深度。参数是当前节点,层数与到当前节点的路径的和。
2026-01-02 16:08:27
759
原创 二叉树part03
当节点栈不为空时,当前遍历节点如果不是叶子节点,就把该节点的孩子节点加入栈中,并保存当前节点到孩子节点的路径保存。首先确定递归的终止条件,当前节点是叶子节点时,根据先前记录的路径,得到了一条二叉树的路径。把每个节点的左右子树的高度差求出和1比较,大于1 就返回-1,代表不是平衡二叉树。从根节点出发,求对应左子树的左叶子之和 和 对应右子树的左叶子之和。否则,记录当前到该节点的路径,递归求左右子树的路径,然后回溯节点。求出每个节点的左子树的节点个数和右子树的节点个数,最后加上根节点。
2025-12-31 22:11:14
359
原创 二叉树part2
这个和二叉树的最大深度不同,由于最大深度会排除初始根节点就没有子树的情况去找最大值。而中序递归 由于先递归左侧 后交换根节点 导致根节点的右子树变成了原来的左子树。求出左子树和右子树的最大深度后,取最大值+1就是二叉树的最大深度。而最小深度会直接返回这个没有子树的最小深度,导致结果错误。当前节点没有左子树时,最小深度就是右子树的最小深度+1。当前节点没有右子树时,最小深度就是左子树的最小深度+1。递归终止条件是当前节点为空,返回0代表子树的深度是0。最小深度的定义是从根节点到叶子节点的路径上的节点个数。
2025-12-30 20:57:22
285
原创 二叉树part1
当左节点是空时,当前栈顶元素就是要处理的节点,将该节点放入结果并出栈,再让遍历的节点指向右节点。如果右节点也是空,由于上次已经把节点出栈,此时栈顶就是又上一层的左节点,又是要处理的。在满足二叉搜索树的基础上,有从根节点出发,左右子树的高度差的绝对值不超过1。那么按照先序遍历,把子树的入栈顺序改为左右,最后再反转结果,就是后序的结果。二叉树的每个节点都包括当前节点的值,指向左子树和右子树的指针。而不同的遍历顺序就是根节点,左子树,右子树入栈的顺序不同。从根节点出发,指针指向每一层的左节点,并放入栈中。
2025-12-29 16:47:21
844
原创 栈和队列part2
那么在放入新元素的时候,如果这个新元素比当前队头元素要大才放入新元素,原队头pop,得到新的滑动窗口的最大值。由于要找的是最大值,那么就单调递减排序,最后队头元素肯定是最大值。如果我当前pop的元素没有在单调队列中,那就不操作,否则出队列。这里使用辅助队列,将原队列中的元素一个一个放入辅助队列中。其中父节点就是队头元素,左右孩子节点中较小的是队尾元素。找到原队列中的最大值,再把辅助队列中的元素放回原队列。当滑动窗口中的元素个数是k个时,遍历队列中的元素。单调队列就是在队列中的元素按单调的顺序排序的队列。
2025-12-27 15:01:44
522
原创 栈和队列part1
先将最后的元素之前的所有元素都出队列1,放到另一个队列2保存,然后将这个最后的元素从第一个队列中出去,然后把之前在队列2中的元素重新放回队列1。和pop的部分操作一样,都是先把进栈当中的元素放到出栈当中,然后出栈的栈顶元素就是类似队列的头元素。那么在栈顶元素之前的所有元素都放入队列2后,res保存答案,再把栈顶元素也放入队列2。使用其中一个栈实现只进操作,将这个只进的栈中的元素全部放入只出的栈,栈顶实现只出。最后栈不为空,说明有左括号没有匹配,为空,说明全部匹配。栈是先进后出的,而队列是先进先出的。
2025-12-26 14:13:19
792
原创 字符串part2
' ' 并且此时slowIndex 要保证大于left,此时更新fastIndex = slowIndex+1,就确定了新单词的右区间。1.slowIndex从尾部开始 ,遇到空格,就确定了单词的左区间,就把从[slowIndex+1,fastIndex)的一个单词加入新的newS。3.当slowIndex > left 的时候,此时还有单词 ,在newSh中加入一个空格。再从left 开始到fastIndex(最后一个单词的右区间),加入单词即可。从标记的位置一个个放入新字符串,直到字符串尾部。
2025-12-25 22:31:58
333
原创 字符串Part1
本题对反转的字符串区间进行了要求,k到2k个字符的前k个反转,不足k个全反转,注意,这里实现的reserve函数要传入字符串s的引用,否则不会改变字符串s。此时要是从前遍历,数字后边的每个字符都要向后移动,较为复杂。根据数字的个数对字符串扩容:这里一个数字要扩容5个空间。可以借助上一题的反转函数,传入要反转的区间标号来实现。i每遍历2k个,就将前k个,即i,i+k进行反转。本题要求不使用额外的空间完成字符串的反转。前一个指针不是数字就放到后一个指针的位置。而由于扩容后的空间在字符串的后边。
2025-12-24 18:24:21
195
原创 哈希表part2
第一反应就是将四个数组两两拆开,求出前两个数组的两两元素相加之和,存在一个集合multiset中,再求出后两个数组的两两元素之和,存在另一个集合multiset中,遍历第一个集合,在第二个集合中能找到相反数,则每个相反数出现的次数就是四元组的个数。那么在遍历j的时候,不符合要求,就把j对应的值放入一个set<int> seen 中,那么下一次遍历j对应的值,去seen集合中找,seen其中的值一定是在i与j之间的,这样就不涉及重复元素的使用了。
2025-12-23 20:14:24
607
原创 哈希表part1
找不到就返回.end()这个值,对应最后一个元素再向后一个位置的迭代器,代表迭代器超出了集合的范围一个元素。注意一次循环后,要改变n 的值为上次n对应的各位平方和,这样才能得到这次平方和对应的下一个各位平方和。那么用unordered_set将给定的数组存储,先去除重复的元素,再与第二个数组进行比较,一次遍历数组中的所有元素,去寻找target减去遍历的元素后 ,对应的值是否存在于map中。如果在这个集合中找到i这个元素,就返回这个元素对应的迭代器,理解为集合中元素对应的下标。
2025-12-22 22:35:06
630
原创 链表part 2
但是由于只要链表存在环形,那么每个节点的next指针指向的都不可能是空,那么就不能通过指针指向是空来得到链表的长度,因为循环时死循环,那么就不能控制fast指针走到 进入环形的 前一个位置。首先明确,如果两个链表有相交的部分,那么相交部分的长度最长不超过两个链表中较短链表的长度,也就是遍历,就可以在长链表后半部分和短链表长度相等的部分开始,如果两个指针相等,那么就是重合部分。一个指针先走n,在走到链表结尾之前,剩下只能走长度-n,再用另一个指针只走长度-n,即可实现到达被删除节点的前一个节点。
2025-12-20 21:17:13
585
原创 链表 1.链表理论基础 2.移除链表元素 3.设计链表 4.反转链表
这里循环条件不用对cur进行判空,因为使用了虚拟头节点,每一次进入循环时,当前节点都不会为空,不会出现未使用虚拟头节点时,将所有节点删完,导致新头节点为空,使得下方cur->next报错出现。1.链表是由一个个节点组成的,每个节点都包括当前节点的值以及指向下一个节点的指针,第一个节点被称为头节点,实际情况中,虚拟头节点也可能是第一个节点。双链表:每个节点都包含两个指针,pre指针指向当前节点的上一个节点,next指针指向当前节点的下一个节点,可以实现由当前指针得到前后两个节点的操作。
2025-12-19 14:50:21
586
原创 2.数组part2 长度最小的子数组 螺旋矩阵 前缀和 开发商买土地
i指向区间的开始位置,j指向末尾位置,用j去遍历数组并求和,满足和大于等于target的时候,同上更新最小值,此时缩小区间,i起始位置进行++的前移,同时此时的和要减去i指向位置的元素,(关键),接着去判断,若仍满足则进行最小值的更新,不满足则继续遍历数组,j向后移,直到j遍历完数组中的所有元素。没做出来的核心是没想到用左闭右开的区间去赋值,原思路是左闭右闭,在一次for循环后会导致数组越界,出来for循环后还有进行--操作,count数也要--,而使用左闭右开则可以完美避开这两个问题。
2025-12-18 21:14:52
265
原创 数组part1 1.二分查找 2. 移除元素 3. 有序数组的平方
由于更新后的寻找区间仍然是左闭右开区间,则left = mid +1;i指向的元素的平方小于j指向的元素的平方,就把j指向元素的平方放到k位置,更新j指针--,继续和i比较;循环条件:while(left <right) :此时right初始值取不到 ,left =right 无意义。mid不直接简单写作(left+right)/2,而是写作(right-left)/2+ left。新建数组,用i控制原数组的元素下标,k控制新数组的元素下标。将较大值放入一个新的数组的末端,且该数组与原数组的大小相等。
2025-12-17 20:14:43
298
原创 数学建模————层次分析法
1.定义:通过相互比较确定各准则对于目标的权重,以及各方案对于每一准则的权重,将方案层对准则层的权重和准则层的权重对于目标层权重进行综合,得到方案对于目标的权重。先检验准备矩阵的一致性,即求出准备矩阵的最大特征值,利用CR=CI/RI,如果CR的值小于0.1,认为该矩阵的一致性是可以接受的。定义一致性比例CR=CI/RI,CR<0.1 认为矩阵的一致性可以接受,CR>=0.1,要对矩阵进行修正。先将判断矩阵进行归一化处理,得到归一化矩阵,再求出每一列的和,除以矩阵的阶数,即得到了对应指标的权重。
2025-11-06 15:38:08
238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅