
【精品专栏】数据结构与算法
文章平均质量分 87
详细讲解常见的数据结构与算法。
「已注销」
这个作者很懒,什么都没留下…
展开
-
【2023】字节跳动 10 日心动计划——第十关
AVL树的定义是递归的,即一个树是AVL树当且仅当根节点的左右子树都是AVL树且两者高度差不超过1。注意细节,路径必须是从根节点到叶子结点。原创 2023-08-18 19:58:07 · 302 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第九关
题目中规定了同一个字符不能出现在多个区间中,因此对于一个字符而言,如果它包含于某个区间,那么这个区间应当包含所有这样的字符。我们依次枚举该区间的每一个字符,并用字符最后一次出现的下标来更新区间的右端点,这样一来,我们就可以得到不可分割的第一个区间。回到本题,为了避免重复,我们同样可以先对数组排个序以确保相同的数字相邻,然后枚举每个位置,对于每个位置,枚举这个位置上对应的数可能出现的次数,即。回顾全排列 II,我们的枚举思路和全排列 I相同,但是为了避免重复,我们固定了相同数字的相对位置。原创 2023-08-13 16:00:17 · 268 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第八关
式在形式上是完全一致的,无非是嵌套的括号数量不一致。代表Python中的字符串乘法)就达到了“去括号”的目的。将链表从中间一分为二,再将后半部分翻转,最后对两个链表进行二路归并即可。那么最内层的括号中一定只含有字母,由于左括号左边一定紧跟数字,所以。由于是循环数组,我们可以先将两个原数组拼接在一起,然后再应用单调栈。的时候,就可以继续执行同样的操作来达到“去括号”的目的。一定是最内层的括号,此时我们需要去掉最内层的括号,让。我们从左向右扫描整个字符串,遇到的第一个。为0,从左向右扫描时不断累加,遇到。原创 2023-08-13 16:00:03 · 300 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第七关
因为对于全排列问题,当前位置的所有状态和数组长度有关,所以我们只能通过for循环来实现。而对于子集问题,当前位置的状态只有两种,因此不必使用for循环,直接展开即可。类似地,对于子集问题,我们同样要遍历当前位置的所有状态,即选当前位置的数或者不选。个位置(当前位置)上的所有状态(假设前。的递归搜索树,我们要在dfs函数里。我们可以举一反三,生成一个长度为。对于递归,则是dfs暴搜一下。轮的时候,我们会漏掉最终的。对于迭代,假设序列的长度为。,我们可以用一串长度为。串,即每个位置要么是。原创 2023-08-06 14:43:58 · 522 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第六关
注意到数组是有序的,因此我们可以用二分去处理,时间复杂度可以降至。,前者不满足这个条件,后者满足这个条件,所以我们可以套用。既然要用二分,那我们就需要找到一个性质能够将区间。是偶数,且数组的长度是奇数,不妨设为。的左右两边各有偶数个元素,从而。不妨设只出现一次的元素的下标是。是否相等,如果相等,则。是否相等,如果相等,则。,从而我们只需要判断。原创 2023-08-05 21:01:11 · 975 阅读 · 1 评论 -
【2023】字节跳动 10 日心动计划——第五关
求有多少个和为K的子数组即求有多少个区间和等于K(注意子数组和子序列不一样,子序列可以是不连续的),而提到区间和就应当想到前缀和。在输入序列中不一定相邻,所以我们要在一开始对输入序列排个序,这样一来,相同的数字就会相邻。字符串的全排列和数字序列的全排列本质是相同的,我们先回顾一下两道数字全排列的题目。在dfs的过程中,我们是从左往右依次填入数字的,在填某一个位置的时候,能够填。本题是典型的dfs,但有一个细节就是,返回的结果不能包含重复的元素。,为方便观察,我们给相同的数字赋予不同的下标,即。原创 2023-08-05 17:06:02 · 462 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第四关
天卖出股票可获得最大利润,那么买入股票必然是在前。更进一步,买入股票应当是第。家能够获得的最大金额,那么我们可以按照第。此外,还可以使用滚动数组将空间复杂度优化至。间房屋,那么剩下可以偷窃的范围就是。间房屋,那么剩下可以偷窃的范围就是。天卖出股票能够获得的最大利润。取两者中的最大值就是本题答案。这说明我们可以维护一个。先回顾第一代的打家劫舍。原创 2023-08-04 23:21:06 · 286 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第三关
具体来讲,我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标。之前我们是让两个指针从中间往两边移动,这次我们让两个指针从两边往中间移动,所以填答案的时候需要倒着填。判断栈是否为空,如果栈为空,说明当前的右括号为没有被匹配的右括号,将其压入栈中,否则,更新答案。注意,任何时刻,只有栈底元素是右括号的下标,其他元素都是左括号的下标!方法一:找到正负元素的分界线,然后对正、负数组进行二路归并。,则将其下标压入栈中;原创 2023-08-04 20:59:12 · 668 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第二关
的形式,但其中有若干个位置上的数是错误的,每一个错误的位置就代表了一个缺失的正数。,由此可知缺失的数是2。恢复后,数组应当具有。原创 2023-07-21 23:04:14 · 338 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——第一关
看到前缀应当想到,我们可以将dictionary中的每个单词都插入到前缀树中,然后扫描sentence中的每个单词看是否需要进行替换。原创 2023-07-18 10:14:47 · 512 阅读 · 0 评论 -
【2023】字节跳动 10 日心动计划——导航
关于该专题的刷题已整理完毕,以下是内容导航。原创 2023-08-18 22:11:00 · 342 阅读 · 0 评论 -
数据结构Python版(一)——顺序表
线性表就是数据元素的排列像一条线一样的表。线性表严格的定义是具有相同特性的数据元素组成的一个有限序列。其特征有3个:不同于集合,线性表中可以出现值相同的元素。线性表的逻辑结构一般表示为 (a0,a1,⋯ ,an−1)(a_0,a_1,\cdots,a_{n-1})(a0,a1,⋯,an−1),用 n(n≥0)n(n\geq0)n(n≥0) 表示线性表的长度(即线性表中元素的个数)。当 n=0n=0n=0 时,表示线性表是一个空表,不包含任何数据元素。线性表的逻辑特征:每个元素最多只有一个前驱元素,也最原创 2022-06-14 10:32:10 · 5687 阅读 · 22 评论 -
数据结构Python版(二)——链表
数据结构-Python-链表原创 2022-06-20 15:54:30 · 2100 阅读 · 15 评论 -
数据结构Python版(三)——栈
栈是一种只能在同一端进行插入/删除操作的线性表。表中允许进行插入/删除操作的一端称为栈顶。栈顶的当前位置是动态的,可以用一个称为栈顶指针的位置指示器来指示。表的另一端称为栈底。当栈中没有元素时称为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为出栈或退栈。栈的一大特点是 LIFO,即 Last In First Out。抽象数据类型栈的定义如下:数据对象:D={ai∣0≤i≤n−1,n≥0}数据关系:R={r}r={∣ai,ai+1∈D,i=0,⋯ ,n−2}基本运算:empty......原创 2022-06-23 09:30:20 · 1482 阅读 · 7 评论 -
数据结构Python版(四)——队列
队列是一种操作受限的线性表,其限制为仅允许在表的一端插入,而在表的另一端进行删除。把进行插入的一端称为队尾(rear),把进行删除的一端称作队头或队首(front)。向队列中插入元素称为进队或入队,从队列中删除元素称为出队或离队。队列的一个显著特点是:FIFO(First In First Out)。队列需要实现的方法和栈一样:、、 和 。采用顺序存储结构的队列称为顺序队。我们用列表 来存放队列中的元素,另外设置两个指针,队头指针为 front,队尾指针为 rear。为简单起见,这里使用固定容量的列表:f原创 2022-06-25 15:42:09 · 2626 阅读 · 8 评论 -
LeetCode 786. 第 K 个最小的素数分数
个“链表”的表头加入到优先队列中,后续看哪一个链表的表头被弹出,就向优先队列中加入该链表的下一个“节点”。于是我们可以像「合并K个有序链表」那样找到第。个“链表”全部构造出来,花费的时间就已经是。这里有一个巧妙的做法,我们一开始只把。次后,优先队列的队头就是最终的答案。因为用到了排序,所以时间复杂度是。本题还有更优雅的解法,复杂度为。这里有一个小细节,我们在判断。,这样不会引入浮点数的误差。注意,如果我们一开始就把。的时候可以将其转化成。中选,因此我们可以将。原创 2023-08-18 21:19:19 · 321 阅读 · 0 评论 -
AcWing 725. 完全数
AcWing 725. 完全数原创 2023-01-02 15:10:27 · 531 阅读 · 0 评论 -
AcWing 756. 蛇形矩阵
AcWing 756. 蛇形矩阵原创 2023-01-02 19:03:52 · 496 阅读 · 2 评论