![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录学习
文章平均质量分 50
寒酩
这个作者很懒,什么都没留下…
展开
-
代码随想录第24天:回溯,77.组合
个数的组合,不设置返回值,定义一个全局变量接收每次遍历得到的结果。参数主要包括三个:int型的n,表示在1到n范围内,k表示是k个数的组合,startIndex表示从哪个下标开始(为了避免重复)3、单层回溯逻辑:一次递归可以确定一个数,接下来要对剩下的对应元素继续递归找第二个数,一直递归到找到第k个数。记住递归和回溯的相伴的。2、回溯终止条件:n表示回溯的宽度,k表示回溯的深度,当遍历到深度为k的时候,说明已经达到k个数了,就不需要在继续了,返回即可。1、确认回溯函数名、参数和返回值:本题要列出。原创 2023-04-28 16:56:18 · 121 阅读 · 0 评论 -
代码随想录第23天:669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
因为二叉搜索树的性质,如果当前遍历节点的val小于low,那么当前节点的左子树全部不满足,都应该删除,但右子树不一定,所以需要继续对右子树进行修剪。同理,如果当前遍历节点的val大于high,那么当前节点的右子树全部不满足,都应该删除,但左子树不一定,所以需要继续对右子树进行修剪。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。思路:相当于按照“右中左”的顺序遍历节点,并且每次遍历的节点的值等于前面遍历所有节点的和。题目描述:给你二叉搜索树的根节点。原创 2023-04-28 15:52:54 · 124 阅读 · 0 评论 -
代码随想录第22天:235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
由于是二叉搜索树,因此可以利用节点的值进行比较,如果p、q节点的值都小于当前节点,那么递归的去左子树寻找,如果p、q节点的值都大于当前节点,那么递归地去右子树寻找,如果当前节点的值正好位于p、q节点之间(),那么当前节点就是p和q的最近公共祖先。否则的话,判断val值,val小于当前结点的值,往左子树插入,如果左子树为空,直接插入并break,如果左子树非空,那么root移到左子树的头结点继续比较;4)root左右节点都不为null:把左子树的头结点作为右子树的最左边节点的子节点,返回右子树头节点。原创 2023-04-27 19:28:07 · 131 阅读 · 0 评论 -
代码随想录第21天:
单层递归逻辑:当前遍历节点的左右节点都不为空时,返回该节点,其中一个节点不为空时,返回相应节点。递归法:利用中序遍历先得到一个递增列表,再对列表中的元素遍历求出最小绝对值差。记住两点:1)二叉搜索树是有序的,其中序遍历是一个递增序列。递归出口:遍历到空结点、p节点或者q节点后返回该节点。递归:用后序遍历方法,从根部逐渐向上遍历。递归法:直接在中序遍历中找到最小绝对值差。迭代法:在中序遍历的基础上。递归法:利用中序遍历求解。原创 2023-04-24 21:01:22 · 101 阅读 · 0 评论 -
代码随想录第20天:654.最大二叉树、617.合并二叉树 、700.二叉搜索树中的搜索 、98.验证二叉搜索树
对合并时候可能的情况的进行了分类,如果左右都为空,返回null,如果只有一个为null的话返回另一个,如果都不为空的话返回二者之和。递归法:通过中序遍历得到一个理论上按照从小到大 排序的序列,最后判断该序列是不是递增的,如果不是的话就不是二叉搜索树。如果记录最大值所在的节点会比记录最大值适用性更强,因为如果测试用例中有long的最小值的话,就会出错。定义一个全局max用来记录当前遍历得到的最大值,如果遍历过程中出现比max小的,说明不是二叉搜索树。迭代法:基于中序遍历的基础上,用栈来模拟。原创 2023-04-24 14:38:06 · 28 阅读 · 0 评论 -
代码随想录第18天:513.找树左下角的值、112. 路径总和 113.路径总和ii、106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
这个题和112的区别在于要输出所有的路径,这里需要注意的是递归出口的时候得重新new一个ArrayList对象,貌似是因为Java是引用传递,那样当list回溯的话,值会发生改变。2)递归终止条件:当当前传入结点的左右子节点都为空的时候,如果当前深度大于所记录的最大深度,则更新最大深度值和result值并返回。1)递归函数参数和返回值:传入参数分别为结点和当前深度,通过全局变量来记录最大深度和左下角的值,因此没有返回值。3)单层递归逻辑:遍历当前节点的左子树和右子树的最大深度对应的节点值。原创 2023-04-23 23:13:23 · 31 阅读 · 0 评论 -
代码随想录第17天:110.平衡二叉树 、257. 二叉树的所有路径 、404.左叶子之和
1)递归函数参数和返回值确定:因为所求的是二叉树的所有路径,递归的话应该考虑前序遍历每次到达叶子节点的时候把当前路径输出,故参数主要包括三个,一个node节点用于遍历,paths列表用于存储当前遍历路径上节点的值,list列表用于存储符合要求的路径。迭代法按照先序遍历的方式,每次把节点入栈,同时还把当前的路径入栈,每次把路径pop,同时也把节点pop,这样可以遍历到每个叶子结点,输出相应的路径即可。2)递归终止条件:当遍历到叶子节点,也就是当前节点的左右节点都为空的时候,输出当前遍历的路径。原创 2023-04-21 22:10:27 · 54 阅读 · 0 评论 -
代码随想录第16天:104.二叉树的最大深度 559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
3)单层递归逻辑:当前传入的结点不为空的时候,求出左子结点的最小深度和右子节点的最小深度。如果左结点为空,右结点不为空,最小深度应该为右节点的最小深度+1,如果右结点为空,左结点不为空,最小深度应该为左节点的最小深度+1。3)单层递归逻辑:当前结点不为空,求出左节点的最大深度和右节点的最大深度,返回左节点和右节点中的最大值+1(+1是因为要考虑当前结点)3)单层递归逻辑:返回当前节点的左子树的节点数量和右子树的节点数量之和+1。3)单层递归逻辑:返回当前节点的左子树的节点数量和右子树的节点数量之和+1。原创 2023-04-21 14:13:45 · 29 阅读 · 0 评论 -
代码随想录第15天:● 层序遍历 ● 226.翻转二叉树 ● 101.对称二叉树
递归每次返回一个是否对称的结果,因此返回值为boolean。每次比较两个子树是否是相互翻转的,所以参数应该是左子树的头结点和右子树的头结点。感觉比较像一生二,二生四的原理,每次队列中维持的元素都是一层的所有元素,而每次把队列中的元素出队的同时,也把元素结点的左右结点入队。总结:今天感觉递归更熟练了,但是迭代法写着还是生疏。“比较的是根节点的两个子树是否是相互翻转的”。把遍历和要做的操作分开考虑,不容易混乱。把每层的最后一个元素记录下来即可。两道题目代码是一样的,原理类似。原创 2023-04-19 14:28:35 · 34 阅读 · 0 评论 -
代码随想录第14天:递归遍历、迭代遍历、统一迭代
总结:递归法和统一迭代法在前序、中序和后序遍历中都只有轻微的代码改变,而迭代法需要根据具体的方式有所修改,前序和后序类似。因为栈是先入先出,前序遍历本来是左中右,实际上进行迭代的时候得是右中左,后序遍历在执行一次左中右的遍历后还需要将list进行翻转,中序遍历则相差较大。统一迭代法则只需要稍微改变一下顺序即可,但是具体为啥这样就可行,还没想到是什么样的思路找到如此巧妙的想法使得能够同时适应三个。统一迭代法:前序遍历。原创 2023-04-18 22:40:14 · 116 阅读 · 0 评论 -
代码随想录第13天:239. 滑动窗口最大值、347.前 K 个高频元素
,该队列是单调队列,如果队列为空,那么直接把元素加入队列,如果队列非空,则需要考虑待加入的元素是否比队尾大,如果比队尾元素大,那么移除队尾元素,将该元素添加到队列,如果比队尾元素小,直接添加到队尾。对头元素就是当前滑动窗口的局部最大值,因为队列维护的就是滑动窗口的这么一个范围,如果m为当前滑动窗口的最大值,当滑动窗口右移的时候会出现几种情况:1、新加入窗口的元素不比最大值大,那么最大值保持不变;在于对大顶堆和小顶堆的理解。原创 2023-04-18 13:37:49 · 104 阅读 · 0 评论 -
代码随想录第11天:20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
把每次入栈的元素和栈顶元素比较,如果相互匹配的话,把栈顶元素pop,如果不匹配的话,则把该元素入栈。最后如果栈是空的话,说明匹配了,非空则不匹配。与括号匹配类似,考察栈顶元素和待比较元素是否相同,相同则出栈,否则入栈。理解波兰表达式的原理的话,就能理解如何用栈来求解。原创 2023-04-18 10:01:44 · 35 阅读 · 0 评论 -
代码随想录第10天:232.用栈实现队列、225. 用队列实现栈
栈是先入先出,而队列是先入后出,用两个栈来实现队列,一个栈用来输入,另一个栈用来输出。push的话直接向输入栈添加元素即可,pop和peek则要从输出栈中拿,如果输出栈为空,则需要先将输入栈的全部元素压入输出栈,再从输出栈中进行pop和peek。因为栈是先进后出,而队列是先进先出,所以基本思想是想让后放进了的元素放在队列前面,而先进来的元素在队列后面。原创 2023-04-17 19:30:12 · 37 阅读 · 0 评论 -
代码随想录第八天:344.反转字符串、 541. 反转字符串II、剑指Offer 05.替换空格、 151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
每次移动2k个元素,如果区间中>=k个元素,就把前k个元素反转,如果没有k个元素,那么begin+k将会超过字符串长度,这时候end为最后一个下标即可。在不申请额外空间的情况下:先反转前n个字符串,再反转剩余的字符串,最后反转整个字符串。先扩容,再从后往前遍历,遇到空格就替换为“%20”。剑指 Offer 05.原创 2023-04-17 12:34:20 · 36 阅读 · 0 评论 -
代码随想录第七天:454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和
第二次想的时候想着用一个哈希表存储第一个数组和第二个数组的和,再把该哈希表中的值和第三个数组一一遍历求和再存在一个表中,依次类推,直到把所有的都加完,那么看最后有几个0就行。第一次想的时候想到用一个current表示四个元素之和,然后,每次依次挖掉一个,去对应数组中找有无满足相加等于0的数。但是忽略了这是四个数相加而不是两个数相加,导致忽略了同时改变多个位置的情况。因为本题是四数相加,因此可以分组计算,nums1和nums2一组,nums3和nums4一组。先进行排序,再利用双指针求解,注意去重操作。原创 2023-04-16 16:49:31 · 47 阅读 · 0 评论 -
代码随想录第六天:242.有效的字母异位词、349:两个数组的交集、202:快乐数、1:两数之和
考虑将数组的<元素,下标>依次放入HashMap中,之后再遍历数组,如果target减去数组当前遍历值所得的结果在HashMap中存在,需要检查一下找到的这个key对应的value是否和和当前数组下标一致,以满足“数组中同一个元素在答案里不能重复出现”的要求。把一个数组的每个元素依次添加到哈希表res1中,然后对另一个数组进行遍历,如果第二个数组中的元素已经存在哈希表中了,则把该元素添加到resSet中。这里哈希表转为数组是通过遍历哈希表元素,再依次传入数组,也可以采用流的方法。原创 2023-04-14 12:53:09 · 85 阅读 · 0 评论 -
代码随想录第四天:24.两两交换列表中的结点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
24.两两交换列表中的结点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II原创 2023-04-08 23:26:06 · 76 阅读 · 0 评论 -
代码随想录第三天:203.移除链表元素、707.设计链表、206反转链表
移除链表元素,设计链表,反转链表原创 2023-04-08 19:22:07 · 76 阅读 · 0 评论 -
代码随想录第二天:977.有序数组的平方、209.长度最小的数组、59.螺旋矩阵II
有序数组的平方、滑动窗口寻找长度最小的子数组、螺旋矩阵实现原创 2023-04-06 21:29:46 · 183 阅读 · 1 评论 -
代码随想录算法训练营第一天(LeetCode704二分查找、27移除元素)
二分查找和移除元素原创 2023-04-06 10:38:42 · 286 阅读 · 1 评论