- 博客(19)
- 收藏
- 关注
原创 代码随想录day23:二叉树08(修剪二叉树,有序数组转化BST,二叉树转化为累加树,二叉树总结)
这题关键在于不在范围内的树他的子树可能也在范围内,所以需要重构二叉树。这题我们可以尝试用递归法的方式,前序遍历深度优先搜索树递归三部曲:1. 参数以及返回值:参数为当前节点,因为我们需要做修剪,因此通过返回值来移除节点2. 确认终止条件:遇到空间点直接返回3. 确定当前层逻辑:如果当前root小于low,往右递归,返回右子树返回条件的头节点在这个步骤中我们就相当于已经把当前节点删除了,把保留下来的符合条件的右节点嫁接了过来。
2024-07-10 16:48:47
441
原创 代码随想录day22:二叉树07(二叉搜索树公共祖先,二叉搜索树插入,删除二叉搜索树节点)
这题与寻找二叉树的最近公共祖先不一样,我们可以利用二叉搜索树的特性,看当前节点与pq的值的大小关系,然后不停往正确的道路迭代,最终就能找到公共祖先处理好每种情况就行了。
2024-07-04 00:22:59
812
原创 代码随想录day21:二叉树06(二叉搜索树最小绝对差,众数,最近公共祖先)
我们要运用二叉搜索树的特性。还记得我们在上一题中说到,二叉搜索树的中序遍历就是从左下角往上走再走到右下角,最后得到的是一个有序数组。因此我们可以用迭代法的中序遍历去访问记录每次的最小差值,最后直接return。时间复杂度的话只需要遍历一遍树,空间复杂度的话也不需要另外的数组记录。很高效。同时我们也可以用递归法inorder traversal一遍,然后在遍历一遍数组。稍微慢一点点,总体差不多,都是O(n)
2024-06-25 00:11:17
664
原创 代码随想录day20:二叉树05(最大二叉树,合并二叉树,二叉搜索树中的搜索,验证二叉搜索树)
这题和我们day17 二叉树04里面的用后序中序数组构造二叉树的思路基本一模一样。同样也是用我们的递归法。先找出最大值,然后把最大值设置为当前节点,然后用最大值把数组分为左右两部分,然后对左右两部分进行递归。代码如下。
2024-06-22 00:06:27
270
原创 代码随想录day17:二叉树04(找树左下角的值,路径总和,从中序和后序遍历序列构造二叉树)
这题首先非常的一眼bfs,我们直接层序遍历把最后一层找出来然后取第一位就行了。非常的快捷好理解。
2024-06-21 16:51:27
838
原创 代码随想录day16:二叉树03(平衡二叉树,所有路径,左叶子之和,完全二叉树的节点个数)
大家也明白了,比较高度,我们要使用后序遍历。递归三部曲开始分析:1. 函数返回值和参数:传入当前节点,返回当前节点高度。如果当前节点左右高度差大于一,我们直接返回-1终止函数。2. 终止条件,若空节点,高度为03. 单层递归逻辑:分别求出左右子树高度,若差值大于一,则return -1。若左右子树有-1的高度的话,也直接return -1。这一步也是要记得处理的,不然之后可能会出错。
2024-06-20 17:23:02
769
原创 代码随想录day15:二叉树02(反转二叉树,对称二叉树,最大深度,最小深度)
当我们在做二叉树问题时,我们一定要想好要用前中后序遍历还是层序遍历。二叉树问题的大忌就是自己稀里糊涂的过了,但是不知道自己是哪种遍历方法。
2024-06-19 17:30:48
865
原创 代码随想录day14:二叉树01(理论基础,递归遍历,迭代遍历,统一迭代,层序遍历)
二叉树是一种基础的数据结构,是算法面试中的常客,也是许多数据结构的基石。本篇我们介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各个方面的重点,帮助大家扫一遍基础。说到二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。二叉树的递归遍历(preorder 144,inorder 145,postorder94)本篇内容参考自代码随想录就拿我自己来说,我之前一直都不是很了解写递归的方式,一般都是靠玄学来写,能不能过都是靠运气。
2024-06-17 17:33:44
772
原创 代码随想录Day13:stack&queue 03(滑动窗口最大值,前n个高频元素,栈与队列总结)
在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。使用抽象程度越高的语言,越容易忽视其底层实现,而C++相对来说是比较接近底层的语言。我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。
2024-06-13 16:34:33
907
原创 代码随想录Day 12:stack&queue 02(有效的括号,删除字符串中所有相邻的重复项,逆波兰表达式求值)
点2标明了brackets必须按照正确的顺序来close,所以说最后的左框应该1最先消除,这很符合stack的last in first out的特点。由于我们碰到的第一个运算符号代表我们见到了洋葱的第一层,因此我们这里也可以运用到stack的操作,在碰到运算符号后将last in的两部分数据整合成一个数据放在stack的末尾。这题我们也可以用双指针模拟栈,一号指针指向最新的,二号指针指向栈的最后一个,一号指针向前遍历,若有匹配二号指针的,二号指针前移。这题虽然是median的题但是难度也不大。
2024-06-06 19:24:44
340
原创 代码随想录day 10:栈与队列01(理论基础,用栈实现队列,用队列实现栈)
这题其实思路和上一题一样,我们也是设置一个两个queue,然后利用两个queue first in first out的特性,在pop的时候讲两个queue中其他的元素传到each other那里,这样剩下的元素就是我们last in的元素,first out出去。在push的时候将数据都放入input stack,在pop的时候若output stack为空,将input stack内容导入output stack来进行pop。栈即stack,采用的是Last in first out的方法。
2024-06-05 21:03:44
594
原创 代码随想录day9:字符串 02(实现strStr(),字符串总结)
写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。为了清楚地了解前缀表的来历,我们来举一个例子:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。请记住文本串和模式串的作用,对于理解下文很重要,要不然容易看懵。
2024-06-04 20:10:21
1059
原创 代码随想录day8:字符串01(反转字符串1&2,替换数字,翻转单词,右旋转字符串)
今天的题目分析较为简单,是因为由于python的字符串不可变,同时python也有很多好用的built in function能帮我们很好的处理字符串和数组,因此我们的很多思路和方法无法达到卡哥的要求,对字符串进行那么细致的操作。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。这题我们也是向上一题一样用双指针法,只是让遍历的频率变得2k一次,逻辑都是一样的。这题非常的简单直观,我们用双指针就可以轻易写出。
2024-05-30 21:08:21
383
原创 代码随想录day 7:哈希表02(四数相加2,赎金信,三数之和,四数之和,总结)
一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。数组set(集合)map(映射)在C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构的底层实现和用途都有所不同,在关于哈希表,你该了解这些!中我给出了详细分析,这一知识点很重要!
2024-05-29 22:19:21
913
原创 代码随想录day 6:哈希表 1(哈希表基础,有效的字母异位词,两个数组交集,快乐数,两数之和)
总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
2024-05-29 15:23:18
603
原创 代码随想录day3:链表1(移除链表元素,设计链表,与反转链表)
C++版本// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数python 版本。
2024-05-26 18:19:49
1057
原创 代码随想录day2:数组02(双指针,滑动窗口,转圈)
双指针算法的核心思想在于使用两个指针进行遍历,这些指针可以是相同方向(快慢指针)或相反方向(对撞指针)的指针,以达到特定的目的。因为这题数组中的元素有正有负,所以平方后最大的元素只可能出现在头尾两侧,因此这题可以运用相反方向的双指针法,两个指针分别指向头尾,移动速度为一次一个元素,朝中间方向移动,对比两个指针平方后的大小然后进行排序。双指针算法的模型包括对撞指针、快慢指针、滑动窗口和归并排序等,这些模型展示了双指针算法在不同场景下的应用。每个颜色为每次遍历的部分,一定要注意每个拐角边际条件的处理。
2024-05-25 10:38:27
767
原创 代码随想录day1:数组01(二分查找与移除元素)
运用两层for loop,第一个for loop遍历所有元素找target value,第二个for loop用于找到target value之后通过将target value后的元素向前移的方式来更新数组。第一层loop invariant为loop开始时nums的前i+1个元素不包含target value,第二层loop invariant为loop开始时nums[i, j-1]为原nums[i +1, j]。快指针遍历旧的数组,寻找新数组的元素,慢指针指向新数组元素应在的下标位置。
2024-05-23 18:50:38
321
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人