数据结构
文章平均质量分 81
教你秒杀数据结构
末央&
心不畏死,踏尸前行。
展开
-
【手撕数据结构】八大排序神功(上)
我们建堆就是为了排序数组,既然是升序,就是小的在前面,大的在后面。我们建大堆可以保证,堆顶一是最大的,这时候我们只需要把堆顶与数组最后一个元素交换,就可以保证数组最后一个元素是最大的。如果有一个关键码的集合K = { k0, k1, k2,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中。i+2 ) i = 0,1,2…【时间复杂度】:O(NlogN)【时间复杂度】:O(N^2)【空间复杂度】:O(1)【空间复杂度】:O(1)【空间复杂度】:O(1)【空间复杂度】:O(1)原创 2024-09-07 21:43:29 · 584 阅读 · 0 评论 -
【手撕数据结构】二叉树的性质
目录叶子节点和边的性质概念小试牛刀叶子节点和边的性质概念可以看到度为0的节点如F没有边,度为1的节点如C有一条边,而度为2的节点如B有两条边。那么设度为2的节点为a个,度为1的节点为b个。二叉树边 = 2a+b另⼀⽅⾯,由于共有 a+b+c 个节点,所以边数等于 a+b+c-1这里-1是因为:综合上面两个公式,我们2a+b = a + b + c - 1; 推出c = a+1(c为度为0节点,a为度为2节点)所以叶子结点n0 = n2 + 1;小试牛刀这道题已经告诉了我们度原创 2024-08-31 22:19:14 · 488 阅读 · 0 评论 -
【手撕数据结构】二叉树oj题
【代码】【手撕数据结构】二叉树oj题。原创 2024-08-31 10:53:11 · 1198 阅读 · 0 评论 -
【手撕数据结构】链式二叉树
所以当k=1的时候,是第k层,第k层节点个数实际就是第k-1层的左右孩子节点个数,求k-1层节点的左右孩子节点即可。📚当k > 1 时,第k层的结点个数为第k - 1层左孩子节点个数 + k-1层右孩子的结点个数。除了判断k之外,别忘了每次都要判断一下传进来的根结点是否为空,防止访问。规则:二叉树高度 = 左子树和右子树中高度大的那个 + 1。📚当k == 1时,return 1。规则:左子树——右子树——根。原创 2024-08-19 18:00:35 · 994 阅读 · 0 评论 -
【手撕数据结构】Topk问题
对于Top-K问题,能想到的最简单直接的⽅式就是排序,但是:如果数据量⾮常⼤,排序就不太可取了。TOP-K问题:即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。⽐如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。2)⽤剩余的N-K个元素依次与堆顶元素来⽐较,不满⾜则替换堆顶元素。,堆中剩余的K个元素就是所求的前K个最⼩或者最⼤的元素。将剩余N-K个元素依次与堆顶元素⽐完之后,然后。前k个最⼤的元素,则建⼩堆。前k个最⼩的元素,则建⼤堆。原创 2024-08-16 20:49:23 · 276 阅读 · 0 评论 -
【手撕数据结构】二叉树和堆
首先看到结构体的定义及声明,是不是回想起了我们之前所学的顺序表,因为顺序表的底层其实也是一种数组int size;}Hp;原创 2024-08-09 13:52:50 · 809 阅读 · 0 评论 -
【手撕数据结构】把玩栈
栈(stack),栈遵守先进后出的原则,即先入栈的数据后出栈,插入数据是在栈顶插入,被称为压栈。出栈也是与顺序表的尾删一样的,这里直接将top减减,不影响后面再次在那个位置插入数据,会直接覆盖.但需检测栈是否为空,若为空,则不能进行出栈操作。进行入栈操作前,我们需要检测栈的当前状态,若已满,则需要先对其进行增容,然后才能进行入栈操作。栈的内存空间是动态开辟出来的,当我们使用完后必须释放其内存空间,避免内存泄漏。因为栈也是一种线性表,并且在物理结构上也是连续的,所以我们底层采用数组(顺序表)实现。原创 2024-07-21 08:29:18 · 230 阅读 · 0 评论 -
【手撕数据结构】拿捏双向链表
前面说到,链表的结构一共有八种:带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。在这八种结构中,我们只挑两种来进行刨析,即无头单向非循环链表和带头双向循环链表。而今天我们要介绍的双向链表就是带头的,头结点head也被称为哨兵位,如果链表为空,则链表只有一个哨兵位。双向链表的结构为//方便以后修改双向链表存储的数据类型}LTNode;原创 2024-07-20 23:18:12 · 803 阅读 · 0 评论 -
【把玩数据结构】详解队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列遵守先进先出FIFO(First In First Out)的原则。入队列:队列的插入操作叫做入队列,进行插入操作的一端称为队尾。出队列:队列的删除操作叫做出队列,进行删除操作的一端称为队头。原创 2024-07-28 17:02:33 · 339 阅读 · 0 评论 -
【手撕数据结构】循环队列
而使用数组就可以直接移动front指针而不直接删除空间,如果需要重新利用删除的空间直接将front指针指向原来的空间,直接覆盖就行。这里我们需要多开辟一块空间,因为我们需要判断循环队列是否满了,这时候就有人说了,直接判断rear和front指针是否相等就行了啊.但是遗憾的是,我们队列为空的时候front也与rear相等。我们前面已经介绍过队列,他的基本操作就是在队头出元素,在队尾如元素。今天介绍的循环队列与前面的队列有所不同,他可以一直利用申请的空间进行循环的出队列,入队列等操作。原创 2024-07-29 14:27:59 · 415 阅读 · 1 评论 -
【手撕数据结构】拿捏单链表
单链表也叫做无头单向非循环链表,链表也是一种线性结构。他在逻辑结构上一定连续,但是在物理结构上不一定连续(随机开辟空间),链表由一个或多个节点足够,每个节点由两部分组成,一个是存储的数据,一个是指向下一个节点的指针。原创 2024-07-20 08:35:18 · 655 阅读 · 0 评论 -
【手撕数据结构】链表面试题进阶
新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。2.设置random指针,这就体现了我们为什么把新链表的节点尾插到旧链表中相对应的节点的好处,我们可以直接通过变量旧链表->random->next指针找到新链表中的random指针的位置。如果其中一个链表比另一个链表长就始终会比短的链表少走一步,这里我们不妨算出两个链表的长度,求他们的差值,让长的链表先走差值步,再长链表和短链表一起走就行了。如果链表无环,则返回 null。原创 2024-07-31 20:32:48 · 681 阅读 · 1 评论 -
【手撕数据结构】卸甲时/空间复杂度
要想知道什么是空/时间复杂度,就得知道什么是数据结构。这得分两层来理解。我们生活中处处存在数据,什么抖音热点上的国际大事,什么懂的都懂的雍正卸甲等等一系列我们用户看得到的,就是抖音存储在后台服务器的数据。但这些数据都有一个特点,那就是都在抖音的热搜榜单上,而这个榜单就是结构,保证数据在一个固定的位置里以便用户浏览。此外有了数据结构,就离不开算法。那么我们刚刚说了,数据结构是把数据有规律的存储在一个结构中,那么怎么从结构中有效率的存取数据,这就是算法。原创 2024-07-08 20:40:07 · 1147 阅读 · 2 评论 -
【手撕数据结构】栈和队列高频面试题
如果需要出栈,则将有数据的队列的size-1个元素移倒另外一个空队列中,将剩下的元素进行出栈。如果要出队列就把入队列的栈一直取栈顶导入为空的出队列中,这样原本1 2 3 4 的由于先进后出就达到了另外一栈存储的是4 3 2 1 这样的顺序,符合队列的先进先出原则。思路:该题是栈的典型应用,满足后进先出的规则(后入栈的前括号将优先与先出现的后括号相匹配)遍历字符串,遇到前括号直接入栈。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。否则,返回 false。原创 2024-07-28 22:54:29 · 263 阅读 · 0 评论 -
【手撕数据结构】把玩顺序表
顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组线性结构又是什么意思,这就不得不提到线性表了线性表(linear list)是n个具有相同特性的数据元素的有限序列线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串注意的是,他在逻辑结构上一定是连续的,但在物理结构上不一定是连续的.线性表在物理上存储时,通常以数组和链式结构的形式存储那么我们知道,数组在内存中存储也是连续的,并且也是类型一致,那么他与顺序表的区别是什么呢.原创 2024-07-19 19:39:04 · 983 阅读 · 0 评论 -
【手撕数据结构】链表高频面试题
n1:记录指针指向将要反转的结点反转后要指向的位置。n2:记录指针指向将要反转的结点。n3:记录指针指向将要反转的结点的下一个结点。原创 2024-07-30 17:56:21 · 785 阅读 · 8 评论