![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录算法跟练
文章平均质量分 78
nx__xn
这个作者很懒,什么都没留下…
展开
-
代码随想录算法跟练 | Day20 | 二叉树 Part05
今天的题目都比较简单,都可以用简单的递归来实现,重点是熟练掌握树的性质和相关的应用。原创 2024-07-03 15:58:58 · 497 阅读 · 0 评论 -
代码随想录算法跟练 | Day17 | 二叉树 Part04
使用递归进行层层切割即可,以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。可以用递归实现,优先选取最左侧节点,仅当左为空时,才考虑右子树,同时维护两个个变量存储最大深度和结果的值即可。简单使用递归实现即可,不断传入新的目标值,当当前节点时叶子节点时,判断目标值是否等于节点值即可。的路径,这条路径上所有节点值相加等于目标和。是同一棵树的后序遍历,请你构造并返回这颗。是指没有子节点的节点。是二叉树的中序遍历,原创 2024-07-02 01:25:53 · 472 阅读 · 0 评论 -
代码随想录算法跟练 | Day16 | 二叉树 Part03
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。本题也是简单题,通过递归返回所有左叶子节点的值即可,但需要注意,虽然是返回左节点的值,依然需要对右节点进行遍历,右节点有可能也存在左叶子节点。题目中平衡二叉树指左右子树最大深度差不超过 1,因此按之前的思路,求出树的最大深度和最小深度,最后判断差值绝对值是否小于等于 1 即可。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。,求出该树的节点个数。原创 2024-06-30 21:34:41 · 458 阅读 · 0 评论 -
代码随想录算法跟练 | Day15 | 二叉树 Part02
本题也是可以使用递归来实现,当根节点为空时,可以判断这个二叉树是对称的,接下来,就是如果左右子树也满足对称,当前二叉树就是对称的。本题可以使用递归的思路,我们可以注意到,翻转一个二叉树后,二叉树中的所有子树其实都经过过翻转,因此可以通过递归让根节点的左右子树先进行翻转操作,然后将根节点的左指针指向右子树根节点,右指针指向左子树根节点,完成当前树的翻转。当当前节点不为空时,该树的最大深度就是左子树的最大深度和右子树最大深度的最大值加一,至此,完成递归。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。原创 2024-06-29 10:00:34 · 361 阅读 · 0 评论 -
代码随想录算法跟练 | Day14 | 二叉树 Part01
二叉树顾名思义,就是由一个或多个节点组成的树形结构,树形结构中起始的节点被称为根节点,而二叉则表示每个节点有两个子节点,通常将一个节点的左右节点为根节点构成的树称为这个节点的左子树和右子树,如果一个节点的左子树和右子树都为空,它被称为二叉树的叶子结点。这是我们平时最常见的二叉树的存储方式,每个节点上存储了当前节点的值,还有左右指针分别指向左右子树的根节点的地址。今天,主要是二叉树的基础知识,包括二叉树的结构、存储方式和遍历方式。,按这样的规律进行存储,结果类似二叉树的层序遍历。,那么它的左孩子就是。原创 2024-06-28 02:32:43 · 371 阅读 · 0 评论 -
代码随想录算法跟练 | Day13 | 栈与队列 Part03
这题和昨天的题目是一样的,在 Java 中这种题统一使用优先队列来做即可,通过优先队列来找到滑动窗口中的最大值,而当发现队首不在滑动窗口范围内时,将队首弹出。这题也和昨天一样,用哈希表存储元素出现频率,然后通过优先队列来进行排序并弹出。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值。,请你返回其中出现频率前。原创 2024-06-27 00:46:06 · 501 阅读 · 0 评论 -
代码随想录算法跟练 | Day11 | 栈与队列 Part02
之前接触过这种题,本身很简单,对于正确的逆波兰表达式,只需要使用一个栈来存储数字,然后当遍历到算符时,将栈顶两个数组取出计算后,将结果压回栈中即可,最后栈中的数就是计算结果。这道题也是优先队列的应用,相比上一题简单很多,只需要先统计数组中各个元素的出现频率,然后将元素和出现的频率放到优先队列中,按元素出现频率从大到小排序。因为是求滑动窗口中的最大值,我们只需要维护一个存储了滑动窗口中元素的优先队列即可,然后由题可知,结果数组长度为。的范围内,它才是有效的,此处,可以使用循环将不符合要求的元素全部出队。原创 2024-06-26 10:33:35 · 498 阅读 · 0 评论 -
代码随想录算法跟练 | Day10 | 栈与队列 Part01
题目让我们使用两个栈来实现队列,已知栈是先进后出的数据结构,队列是先进先出,因此显然要想使得先被压入栈中的元素先被弹出,只使用一个栈是不够的,需要一个辅助栈来实现,将原栈中的元素都放入到辅助栈里再进行出栈操作,就能够做到先压入的元素先被弹出来。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(请你仅使用两个栈实现先入先出队列。总结:今天的题目基本都比较简单,核心都是深入理解栈和队列的特点。(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你所使用的语言也许不支持队列。原创 2024-06-26 01:59:53 · 614 阅读 · 0 评论 -
代码随想录算法跟练 | Day9 | 字符串 Part02
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。,将其中不为空格的内容拼接成字符串单词后存入到栈中,然后将栈中元素依次出栈构建新的字符串即可。当字符不匹配的时候,指针应该移动到失配下标 - 1的前缀表数组的值的下标。字符串的第一个匹配项的下标(下标从 0 开始)。,最长相同前后缀长度为 0。,最长相同前后缀长度为 1。,最长相同前后缀长度为 0。,最长相同前后缀长度为 1。,最长相同前后缀长度为 2。,下标 0 处子串为。原创 2024-06-23 23:58:41 · 366 阅读 · 0 评论 -
代码随想录算法跟练 | Day8 | 字符串 Part01
的额外空间,因此要考虑在原数组上进行修改,所以想到了使用前面学的双指针。通过头尾双指针向中间遍历,然后依次交换头尾指针指向的字符,即可做到字符串反转。最简单的思路就是创建一个等长的数组,然后反向遍历原数组填入到新数组中,但本题要求是。今天的题目大体上都是字符串中最基础的题型,熟练掌握前面学习的双指针就可以完成了。使用双重循环实现即可,外层循环确定反转的起始终止位置,内层循环进行反转操作。编写一个函数,其作用是将输入的字符串反转过来。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用。原创 2024-06-23 12:03:58 · 480 阅读 · 0 评论 -
代码随想录算法跟练 | Day7 | 哈希表Part2
看到四数相加,第一反应是双指针的题目,然后才发现这题和之前的双指针不一样。因此我们可以用前一天的两数相加的思路来做这一题,将四个数组两两组合相加,并存储结果。的数了,可以直接返回结果。反之,可以从第二个数的位置到数组最后一位之间使用二分法开始查找第三个数。这题思路与上一题基本一致,不过就是二分法的时候,是用两端指针的值进行判断,而不是。因为我的数组是从小到大排序的,如果第一个数大于。这题的思路和之前的字母异位词基本相同,只不过限制条件没有那么苛刻,只需要。中的字符出现次数存储到一个哈希表中,然后遍历。原创 2024-06-02 18:24:14 · 515 阅读 · 0 评论 -
代码随想录算法跟练 | Day6 | 哈希表Part1
这道题初看没有什么头绪,如果输入是快乐数,那判断很简单,但是如果不是快乐数,陷入无限循环,如何终止循环就是一个问题了。但通过这个计算方式我们可以知道,每次计算的结果肯定是受限在一个范围内的,而如果这个范围内的数字在结果中重复出现了,就可以判定是陷入了。这题和上一题类似的地方是要考虑元素的出现,但并不需要统计出现次数,而是要保证结果中元素的唯一性,所以可以使用哈希表的特殊应用。来对每次计算的结果进行暂存,如果在集合中重复出现了,就是陷入无限循环,返回。的那 两个 整数,并返回它们的数组下标。原创 2024-06-01 23:15:16 · 736 阅读 · 0 评论 -
代码随想录算法跟练 | Day4 | 链表Part2
已知倒数第 n 个节点其实就是最后一个节点往前推 n 个节点,那么遍历的时候,我们一开始可以使用两个指针,一个指针先于另一个指针 n 个节点到达链表结尾,此时慢的那个指针的位置就是我们找的位置。这道题也是用追及的思路,使用快慢指针,快指针一次走两步,慢指针一次走一步,因此在存在环的情况下,相当于快指针每次追一步,两个指针会在环的入口处相遇。本题的一个重点在于,节点的数值相同不代表节点相同,应该是节点的地址相同,这一点在 Java 中可以直接用。,返回链表开始入环的第一个节点。个结点,并且返回链表的头结点。原创 2024-05-28 01:17:15 · 487 阅读 · 0 评论 -
代码随想录算法跟练 | Day3 | 链表Part1
而在整个链表中,只有头结点没有前驱节点,所以我们可以创建一个虚拟头结点指向头结点,来保证所有操作的一致性。接下来只需要维护两个指针依次指向遍历到的节点,和遍历到的节点的前驱节点即可。在链表题目中,解题最关键的地方就是不能吝啬创建临时节点来作为辅助。在本题里,传入一个链表,要求删除指定的元素,而要想删除链表中的某一个节点,需要定位到它的前一个节点,然后把前一个节点的。感觉理解了虚拟头结点的用法之后,这道题也比较简单了,先创建一个指向空链表的虚拟头结点,然后遍历原链表,不断将原节点头插到新链表中即可。原创 2024-05-24 22:28:01 · 876 阅读 · 1 评论 -
代码随想录算法跟练 | Day2 | 数组Part2
我们可以发现,在暴力解法里,每次更新起始点后的累加计算里,其实出现了较多的重复计算,我们可以考虑是否有办法避免这种情况。因此有如下实现思路:维护两个指针标记当前数组还未进行计算的部分的首尾,然后计算这两个指针指向元素的平方值,将得到的较大的值。,我们可以想到,用两个指针来标记区间的首尾,然后维护一个变量来表示这个区间所有元素的总和,这就是。我们只需要不断滑动区间的首尾指针来标记合适的区间范围,就可以通过单次遍历操作来达成题目的需求。到新的数组序列中(可以对新的数组维护一个从后往前移动的指针),保证。原创 2024-05-23 22:39:26 · 798 阅读 · 1 评论 -
代码随想录算法跟练 | Day1 | 数组基础Part1
我们可以很轻松地想到暴力解法,即遍历数组的同时进行判断,如果出现需要移除的元素,则通过循环将该元素后的所有元素前移一位即可,同时维护一个变量记录数组长度就能满足所有需求。通过快指针去对数组进行遍历操作,慢指针来标记当前最高有效位的下一位,然后把遍历到的有效元素存入到慢指针指向的位置即可,这种算法因为避免了数组元素批量移动时的遍历操作,时间复杂度是。这部分知识点相对来说比较简单,通常情况下,暴力解法也能满足需求,但是当出现重复遍历的情况时,其实可以考虑一些常见的优化方式,如这里的双指针法。原创 2024-05-22 13:12:26 · 1143 阅读 · 1 评论