
数据结构
文章平均质量分 70
。
nx__xn
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
每日一练 | Day 15
栈顶元素,就将两个栈顶元素都出栈。最终,如果维护的栈为空,就说明符合条件。本题的解题思路还是比较简单的,按照题意进行模拟即可。数组依次进栈的同时,尝试让栈顶出栈,如果栈顶元素等于。数组为一个栈,我们只需要额外维护一个栈,将。,只有当它们可能是在最初空栈上进行的推入。数组为进栈顺序,我们可以视。两个序列,每个序列中的。操作序列的结果时,返回。原创 2024-08-23 22:11:46 · 397 阅读 · 0 评论 -
每日一练 | Day 14
表示将目录切换到上一级(指向父目录);任意多个连续的斜杠(即,本题是经典的可以使用栈实现的场景,我们可以先通过一个栈来对字符串内容进行处理和重新拼接。此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含。(以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。的正常文件名时,将文件名压入栈中,如果读取到。对于此问题,任何其他格式的点(例如,说明是退回上一级目录,即目前栈顶的文件。)表示当前目录本身;最后一个目录名(如果存在)不能 以。,表示指向某一文件或目录的。风格的文件系统中,一个点(原创 2024-08-20 23:56:52 · 401 阅读 · 0 评论 -
每日一练 | Day 13
个这样的子问题,每个子问题都可以根据前面的子问题得出解,根据这个,我们就可以得到子问题之间的递推公式。题目中说不能偷相邻的房屋,因此如果偷第。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,本题是很经典的动态规划题,对于动态规划题,我们要先定义子问题然后构造。给定一个代表每个房屋存放金额的非负整数数组,计算你。,一夜之内能够偷窃到的最高金额。就表示这个子问题的解,当。中的最大值,至此,完成。个房屋,就不能去偷第。原创 2024-08-16 19:39:35 · 338 阅读 · 0 评论 -
每日一练 | Day 12
接下来开始对所有区间进行遍历,我们要考虑遍历过程中的条件判断,已知当前区间右侧所有区间的左端点都大于等于当前区间左端点,因此可以得到两种情况:情况一,如果遍历到的区间左端点小于或等于当前区间右端点,则说明可以与当前区间合并,因此当前区间左端点,即。情况二,如果遍历到的区间左端点大于当前区间右端点,则说明当前遍历到的是新的区间了,因此把当前区间左右端点加入到结果集中,然后将当前区间更新为遍历到的区间即可。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。原创 2024-08-15 11:15:23 · 238 阅读 · 0 评论 -
每日一练 | Day 11
对原字符串进行存储,便于后续编辑操作。本题显然也可以使用回溯法来做,而比起之前不断构造新的路径的思路,这题显然尝试不断向原字符串中插入。,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在。在回溯的递归函数中,我们需要考虑传入哪些参数,首先,暂存的。对象是需要的,然后是当前加点切割的起始点。而为了便于终止回溯,我们再传入一个。,接下来,就按照回溯的思路来写就行了。用于记录当前已经添加了多少个。是 有效 IP 地址,但是。之间组成,且不能含有前导。会更加简便,所以考虑使用。原创 2024-08-14 18:52:31 · 195 阅读 · 0 评论 -
每日一练 | Day 10
是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。的空间,最少放置多少个物品。我选择使用动态规划进行求解,先定义 一个长度为。本题可以使用背包问题的思路来进行求解,即有若干大小为一个整数的平方的物品,如。的空间,至少要使用多少物品。表示因为要求的是最小值,所以先使用。然后就可以开始考虑递推公式了,我们可以枚举从 1 到。将数组所有元素初始化为最大值,同时设置初始值。等,要使用这些物品填满大小为。的完全平方数的最少数量。原创 2024-08-12 01:47:40 · 182 阅读 · 0 评论 -
每日一练 | Day 9
本题与之前做过的链表题不同,其他链表题是给出了链表的头结点,然后指定删除节点,这道题是直接给了需要删除的节点,但是没有提供头结点。一开始我没有完全想明白题目意思,但还是根据题目给的条件想出通过递归来实现求解,也就是不删除除链表尾部节点之外的任何节点,只是将待删除节点后面所有的节点值往前移动。做完题目后,我去看了下官方题解,才发现实际上我想复杂了,虽然没有办法直接删除掉要删除的节点,但完全可以将下一个节点的值复制到当前节点,然后。时,就已经完成了对于链表所有值的移动操作,结束递归。不是链表中的最后一个节点。原创 2024-08-11 02:21:51 · 239 阅读 · 0 评论 -
每日一练 | Day8
对象来保存当前的结果集状态,然后开始进行回溯即可。代码中,还需要注意终止递归的时机和更新结果集的时机,因为这题是所有子集,没有限制情况,所以我们在递归方法一开始就将结果添加到结果集中,而当起始位置无效,即大于等于数组长度时,就终止递归。本题是很经典的回溯题,回溯算法的核心就是状态的更改和回溯,在这题里,我们创建一个。,数组中的元素 互不相同。返回该数组所有可能的。原创 2024-08-10 02:00:56 · 388 阅读 · 0 评论 -
每日一练 | Day 1
而如果结果为奇数,则需要进行处理:将结果中的一个偶数移除,替换成一个奇数,或者移除一个奇数,换上一个偶数。本题显然可以用贪心的思路,无论是否满足条件,先尽可能将最大的卡牌加到结果中,然后如果不满足总和为偶数的情况,再进行调整。因此,优先将数组进行排序,并求出前。首先,我们调整一下前面的部分,在计算和的时候,同时把结果中最小的奇数和偶数记录下来,此处分别使用变量。表示的值不存在的情况,即中间遍历的部分数组是纯奇数或纯偶数,因此要进行详细的判断。接下来,统计数组剩余部分中最大的奇数和偶数,此处分别使用变量。原创 2024-08-01 01:18:59 · 332 阅读 · 0 评论 -
每日一练 | Day 2
的表述看上去复杂,实际上很简单,即以一个元素作为三角形的角上的点,如果和这个元素的位置同行同列均有元素,就可以组成直角三角形。分别指代坐标(x,y)处行和列上值为 1 的元素个数。中 3 个元素满足:一个元素与另一个元素在。这 3 个元素互相之间不需要相邻。,那么这 3 个元素称为一个。,同时与第三个元素在。原创 2024-08-02 01:14:29 · 601 阅读 · 0 评论 -
每日一练 | Day 3
因为我们预先无法知道二叉树的具体形状,因此无法直接求得二叉树最右侧的所有节点,但是如果使用层序遍历,我们可以很轻松得到,每层最右边的节点或者说是最后一个节点就是我们想要求的内容。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。相对来说今天的题目不难,就只是二叉树层序遍历最基本的运用方式。二叉树、广度优先搜索。原创 2024-08-03 00:46:53 · 185 阅读 · 0 评论 -
每日一练 | Day 4
的子串,然后求出其中最长的的长度,因此,我们可以用滑动窗口法,即维护一个双指针,使得左右指针范围内的所有数组元素都是唯一的。而要保证唯一性,我们可以这样做,使用一个列表存储左右指针范围内的所有元素,当右指针向右移动时,如果指针指向的元素不在列表内,就说明当前窗口符合要求,因此可以考虑更新结果。当出现重复元素时,移动左指针,同时把因为左指针移动变到窗口外的元素移除列表即可。在本题里面,为了提高列表删除的效率,可以使用哈希的存储结构,此处 java 使用。,请你找出其中不含有重复字符的。原创 2024-08-05 00:26:05 · 423 阅读 · 0 评论 -
每日一练 | Day 5
这题是很经典的图算法题,常见的做法有用深度优先搜索或者广度优先搜索,我选择使用深搜来做。本题的思路也很简单,当找到未被遍历到过的陆地时,就把它记做岛屿,然后以他为起点向周围进行遍历,将周围连接着的陆地都标记为已遍历,这样就能保证每次增加岛屿数量时,都是新的岛屿,不会重复。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。(水)组成的的二维网格,请你计算网格中岛屿的数量。此外,你可以假设该网格的四条边均被水包围。深度优先搜索、广度优先搜索。原创 2024-08-06 12:41:32 · 311 阅读 · 0 评论 -
每日一练 | Day 6
链表题有个特点,只要舍得定义临时变量,就能较轻松的做出来。今天这题是调整了反转链表,改为部分反转,对于这个需求,我们可以通过头插和尾插法相结合来实现。的地方进行尾插即可。题目中需要注意进行完头插操作后,此时的临时头结点还是开始头插操作时的位置,我们需要把它移动到链表的最后再开始进行尾插操作。的地方进行尾插操作,在反转区间内进行头插操作,最后在大于。区间处需要进行反转操作,我们可以在小于。原创 2024-08-08 01:33:26 · 373 阅读 · 0 评论 -
每日一练 | Day 7
今天做两道经典多线程题。原创 2024-08-09 02:26:24 · 438 阅读 · 0 评论 -
代码随想录算法跟练 | Day20 | 二叉树 Part05
今天的题目都比较简单,都可以用简单的递归来实现,重点是熟练掌握树的性质和相关的应用。原创 2024-07-03 15:58:58 · 623 阅读 · 0 评论 -
代码随想录算法跟练 | Day17 | 二叉树 Part04
使用递归进行层层切割即可,以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。可以用递归实现,优先选取最左侧节点,仅当左为空时,才考虑右子树,同时维护两个个变量存储最大深度和结果的值即可。简单使用递归实现即可,不断传入新的目标值,当当前节点时叶子节点时,判断目标值是否等于节点值即可。的路径,这条路径上所有节点值相加等于目标和。是同一棵树的后序遍历,请你构造并返回这颗。是指没有子节点的节点。是二叉树的中序遍历,原创 2024-07-02 01:25:53 · 593 阅读 · 0 评论 -
代码随想录算法跟练 | Day16 | 二叉树 Part03
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。本题也是简单题,通过递归返回所有左叶子节点的值即可,但需要注意,虽然是返回左节点的值,依然需要对右节点进行遍历,右节点有可能也存在左叶子节点。题目中平衡二叉树指左右子树最大深度差不超过 1,因此按之前的思路,求出树的最大深度和最小深度,最后判断差值绝对值是否小于等于 1 即可。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。,求出该树的节点个数。原创 2024-06-30 21:34:41 · 582 阅读 · 0 评论 -
代码随想录算法跟练 | Day15 | 二叉树 Part02
本题也是可以使用递归来实现,当根节点为空时,可以判断这个二叉树是对称的,接下来,就是如果左右子树也满足对称,当前二叉树就是对称的。本题可以使用递归的思路,我们可以注意到,翻转一个二叉树后,二叉树中的所有子树其实都经过过翻转,因此可以通过递归让根节点的左右子树先进行翻转操作,然后将根节点的左指针指向右子树根节点,右指针指向左子树根节点,完成当前树的翻转。当当前节点不为空时,该树的最大深度就是左子树的最大深度和右子树最大深度的最大值加一,至此,完成递归。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。原创 2024-06-29 10:00:34 · 470 阅读 · 0 评论 -
代码随想录算法跟练 | Day14 | 二叉树 Part01
二叉树顾名思义,就是由一个或多个节点组成的树形结构,树形结构中起始的节点被称为根节点,而二叉则表示每个节点有两个子节点,通常将一个节点的左右节点为根节点构成的树称为这个节点的左子树和右子树,如果一个节点的左子树和右子树都为空,它被称为二叉树的叶子结点。这是我们平时最常见的二叉树的存储方式,每个节点上存储了当前节点的值,还有左右指针分别指向左右子树的根节点的地址。今天,主要是二叉树的基础知识,包括二叉树的结构、存储方式和遍历方式。,按这样的规律进行存储,结果类似二叉树的层序遍历。,那么它的左孩子就是。原创 2024-06-28 02:32:43 · 497 阅读 · 0 评论 -
代码随想录算法跟练 | Day13 | 栈与队列 Part03
这题和昨天的题目是一样的,在 Java 中这种题统一使用优先队列来做即可,通过优先队列来找到滑动窗口中的最大值,而当发现队首不在滑动窗口范围内时,将队首弹出。这题也和昨天一样,用哈希表存储元素出现频率,然后通过优先队列来进行排序并弹出。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值。,请你返回其中出现频率前。原创 2024-06-27 00:46:06 · 641 阅读 · 0 评论 -
代码随想录算法跟练 | Day11 | 栈与队列 Part02
之前接触过这种题,本身很简单,对于正确的逆波兰表达式,只需要使用一个栈来存储数字,然后当遍历到算符时,将栈顶两个数组取出计算后,将结果压回栈中即可,最后栈中的数就是计算结果。这道题也是优先队列的应用,相比上一题简单很多,只需要先统计数组中各个元素的出现频率,然后将元素和出现的频率放到优先队列中,按元素出现频率从大到小排序。因为是求滑动窗口中的最大值,我们只需要维护一个存储了滑动窗口中元素的优先队列即可,然后由题可知,结果数组长度为。的范围内,它才是有效的,此处,可以使用循环将不符合要求的元素全部出队。原创 2024-06-26 10:33:35 · 629 阅读 · 0 评论 -
代码随想录算法跟练 | Day10 | 栈与队列 Part01
题目让我们使用两个栈来实现队列,已知栈是先进后出的数据结构,队列是先进先出,因此显然要想使得先被压入栈中的元素先被弹出,只使用一个栈是不够的,需要一个辅助栈来实现,将原栈中的元素都放入到辅助栈里再进行出栈操作,就能够做到先压入的元素先被弹出来。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(请你仅使用两个栈实现先入先出队列。总结:今天的题目基本都比较简单,核心都是深入理解栈和队列的特点。(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你所使用的语言也许不支持队列。原创 2024-06-26 01:59:53 · 723 阅读 · 0 评论 -
代码随想录算法跟练 | Day9 | 字符串 Part02
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。,将其中不为空格的内容拼接成字符串单词后存入到栈中,然后将栈中元素依次出栈构建新的字符串即可。当字符不匹配的时候,指针应该移动到失配下标 - 1的前缀表数组的值的下标。字符串的第一个匹配项的下标(下标从 0 开始)。,最长相同前后缀长度为 0。,最长相同前后缀长度为 1。,最长相同前后缀长度为 0。,最长相同前后缀长度为 1。,最长相同前后缀长度为 2。,下标 0 处子串为。原创 2024-06-23 23:58:41 · 478 阅读 · 0 评论 -
代码随想录算法跟练 | Day8 | 字符串 Part01
的额外空间,因此要考虑在原数组上进行修改,所以想到了使用前面学的双指针。通过头尾双指针向中间遍历,然后依次交换头尾指针指向的字符,即可做到字符串反转。最简单的思路就是创建一个等长的数组,然后反向遍历原数组填入到新数组中,但本题要求是。今天的题目大体上都是字符串中最基础的题型,熟练掌握前面学习的双指针就可以完成了。使用双重循环实现即可,外层循环确定反转的起始终止位置,内层循环进行反转操作。编写一个函数,其作用是将输入的字符串反转过来。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用。原创 2024-06-23 12:03:58 · 599 阅读 · 0 评论 -
代码随想录算法跟练 | Day7 | 哈希表Part2
看到四数相加,第一反应是双指针的题目,然后才发现这题和之前的双指针不一样。因此我们可以用前一天的两数相加的思路来做这一题,将四个数组两两组合相加,并存储结果。的数了,可以直接返回结果。反之,可以从第二个数的位置到数组最后一位之间使用二分法开始查找第三个数。这题思路与上一题基本一致,不过就是二分法的时候,是用两端指针的值进行判断,而不是。因为我的数组是从小到大排序的,如果第一个数大于。这题的思路和之前的字母异位词基本相同,只不过限制条件没有那么苛刻,只需要。中的字符出现次数存储到一个哈希表中,然后遍历。原创 2024-06-02 18:24:14 · 653 阅读 · 0 评论 -
代码随想录算法跟练 | Day6 | 哈希表Part1
这道题初看没有什么头绪,如果输入是快乐数,那判断很简单,但是如果不是快乐数,陷入无限循环,如何终止循环就是一个问题了。但通过这个计算方式我们可以知道,每次计算的结果肯定是受限在一个范围内的,而如果这个范围内的数字在结果中重复出现了,就可以判定是陷入了。这题和上一题类似的地方是要考虑元素的出现,但并不需要统计出现次数,而是要保证结果中元素的唯一性,所以可以使用哈希表的特殊应用。来对每次计算的结果进行暂存,如果在集合中重复出现了,就是陷入无限循环,返回。的那 两个 整数,并返回它们的数组下标。原创 2024-06-01 23:15:16 · 866 阅读 · 0 评论 -
代码随想录算法跟练 | Day4 | 链表Part2
已知倒数第 n 个节点其实就是最后一个节点往前推 n 个节点,那么遍历的时候,我们一开始可以使用两个指针,一个指针先于另一个指针 n 个节点到达链表结尾,此时慢的那个指针的位置就是我们找的位置。这道题也是用追及的思路,使用快慢指针,快指针一次走两步,慢指针一次走一步,因此在存在环的情况下,相当于快指针每次追一步,两个指针会在环的入口处相遇。本题的一个重点在于,节点的数值相同不代表节点相同,应该是节点的地址相同,这一点在 Java 中可以直接用。,返回链表开始入环的第一个节点。个结点,并且返回链表的头结点。原创 2024-05-28 01:17:15 · 607 阅读 · 0 评论 -
代码随想录算法跟练 | Day3 | 链表Part1
而在整个链表中,只有头结点没有前驱节点,所以我们可以创建一个虚拟头结点指向头结点,来保证所有操作的一致性。接下来只需要维护两个指针依次指向遍历到的节点,和遍历到的节点的前驱节点即可。在链表题目中,解题最关键的地方就是不能吝啬创建临时节点来作为辅助。在本题里,传入一个链表,要求删除指定的元素,而要想删除链表中的某一个节点,需要定位到它的前一个节点,然后把前一个节点的。感觉理解了虚拟头结点的用法之后,这道题也比较简单了,先创建一个指向空链表的虚拟头结点,然后遍历原链表,不断将原节点头插到新链表中即可。原创 2024-05-24 22:28:01 · 1016 阅读 · 1 评论 -
代码随想录算法跟练 | Day2 | 数组Part2
我们可以发现,在暴力解法里,每次更新起始点后的累加计算里,其实出现了较多的重复计算,我们可以考虑是否有办法避免这种情况。因此有如下实现思路:维护两个指针标记当前数组还未进行计算的部分的首尾,然后计算这两个指针指向元素的平方值,将得到的较大的值。,我们可以想到,用两个指针来标记区间的首尾,然后维护一个变量来表示这个区间所有元素的总和,这就是。我们只需要不断滑动区间的首尾指针来标记合适的区间范围,就可以通过单次遍历操作来达成题目的需求。到新的数组序列中(可以对新的数组维护一个从后往前移动的指针),保证。原创 2024-05-23 22:39:26 · 950 阅读 · 1 评论 -
代码随想录算法跟练 | Day1 | 数组基础Part1
我们可以很轻松地想到暴力解法,即遍历数组的同时进行判断,如果出现需要移除的元素,则通过循环将该元素后的所有元素前移一位即可,同时维护一个变量记录数组长度就能满足所有需求。通过快指针去对数组进行遍历操作,慢指针来标记当前最高有效位的下一位,然后把遍历到的有效元素存入到慢指针指向的位置即可,这种算法因为避免了数组元素批量移动时的遍历操作,时间复杂度是。这部分知识点相对来说比较简单,通常情况下,暴力解法也能满足需求,但是当出现重复遍历的情况时,其实可以考虑一些常见的优化方式,如这里的双指针法。原创 2024-05-22 13:12:26 · 2092 阅读 · 1 评论