算法和刷题总结
文章平均质量分 51
记录一些算法和一些刷错的题目,简单总结总结,便于后续自己复看。
MDchong
这个作者很懒,什么都没留下…
展开
-
数据结构整理-树篇
二叉树是一种非线性结构的数据结构,二叉树的基本单元是节点,每个节点包含值、左字节点引用、右子节点引用。1.1 二叉树基本操作1.1.1初始化操作与链表类似,先初始化节点,再构建引用(指针)。1.1.2插入和删除节点与链表类似通过修改指针实现1.2完美二叉树所有层的节点都被完全填满,在完美二叉树(满er中,除了叶子节点,其他所有节点的度都是2,若树的高度是h,则节点总数是2^(h+1)-1. 呈现标准的指数关系。1.3 完全二叉树只有最底层的节点未被填满,且最底层节点尽量靠左填充。原创 2024-03-31 00:33:42 · 327 阅读 · 0 评论 -
数据结构整理-哈希表篇
哈希表又称散列表,通过键值映射,key-value。可实现高效的元素查询。即向哈希表输入一个键key,就可以在O(1)的时间内查找到value。除了哈希表之外,数组和链表也可以实现查询功能,时间复杂度之间的关系如下:发现哈希表的效率是真滴高!1.哈希表的常见操作初始化、查询、添加键值对、删除键值对等哈希表的遍历方式有:遍历键值对、遍历键、遍历值。2.哈希表的实现仅用一个数组实现哈希表,将数组的每个空位成为桶。原创 2024-03-28 16:20:39 · 2047 阅读 · 0 评论 -
数据结构整理-队列(双向)篇
单向队列仅能从队列的头部删除元素、在队列的尾部添加元素。与其相比,双向队列的灵活性更好,可以在头尾执行元素的添加或删除。双向队列的实现与队列比较类似,同样可以使用数组或者链表实现底层数据结构。注意:上面的方法名不一定是双向队列的正确的成员函数名,只是便于理解。声明:本人所写内容全部参考hello-algo,仅用于个人复习。2.基于双向链表实现。原创 2024-03-27 13:57:01 · 244 阅读 · 0 评论 -
数据结构整理-队列(单向)篇
使用front指向队首元素的索引,使用size维护队列长度,定义rear=front+size,即rear是队尾元素的下一个位置索引。此时发现,无论是入队还是出队,front和rear都在往后移动,当达到数组尾部就无法移动了!可以将链表的头节点和尾节点分别看作“队首”和“队尾”。由于数组删除首元素的时间复杂度是O(n),所以导致出队效率比较低,可以采用以下方式避免这个问题。队列实现必须具备一端加入元素,另一端删除元素的特征,数组和链表都具备这样的特性。的数据结构,队列可以看作日常的排队,先到的现办理业务。原创 2024-03-27 10:01:24 · 189 阅读 · 0 评论 -
数据结构整理-栈篇
将数组的尾部作为栈顶。入栈和出栈分别对应数组尾部的添加和删除元素。由于栈可能会不断的增加,可以使用动态数组实现,这样就不用自己处理数组的扩容问题。对于入栈操作,只需要将元素插入链表头部,这种节点插入方法被称为“头插法”。栈是一种先入先出逻辑的线性结构。栈的实现有两种方式,一种是基于链表的实现,一种基于数组的实现。然而,某些语言可能没有专门提供栈类,这时我们可以将该语言的。此时,链表的头节点是作为栈顶,链表的尾节点作为栈底。当作栈来使用,并在程序逻辑上忽略与栈无关的操作。ii:基于数组的实现。原创 2024-03-22 11:40:17 · 292 阅读 · 1 评论 -
数据结构整理-列表篇
为解决此问题,我们可以使用「动态数组 dynamic array」来实现列表。当使用数组来实现列表时,本质上就是访问和更新对应的数组元素。C++内置了列表,源码实现较为复杂,下面使用数组实现一个简易的列表。列表尾部插入和删除元素时间复杂度O(1),其他地方时间复杂度为O(n)。若插入元素时列表容量已满,则需要进行扩容,规定每次扩容至原来的两倍。的数据结构,表示元素的有序集合。初始化有两种方式,一种无初值初始化,另一种有初值初始化。和数组遍历一样,采用索引遍历。当使用数组实现列表时,3. 插入和删除元素。原创 2024-03-22 10:18:42 · 298 阅读 · 1 评论 -
数据结构整理-链表篇
链表中插入节点很简单,例如如果在n0与n1之间插入节点新节点T,只需要T的”引用“改为n1,把n0的”引用“改为T,即可。上图中链表的组成单位是节点,节点包含”节点的值“和”下一节点的引用【指针】“,链表节点除了节点的值外还包含下一节点的引用,所以同样数据量的情况下,链表比数组占用更多的内存空间,有两种初始化链表的方法,第一种使用节点指针初始化链表(更常用),第二种使用节点对象初始化链表(不常用)。节点之间通过”引用“相连接,”引用“记录了下一个节点的内存地址,可实现从当前节点访问到下一节点。原创 2024-03-21 15:40:59 · 324 阅读 · 1 评论 -
数据结构整理-数组篇
因为数组元素是连续存储的,所以要想在数组中间某个位置插入元素,必须把该位置的元素以后的所有数据都往后移动一位(其实就是从后往前的复制)。删除索引i处的元素,需要把索引i之后的元素都向前移动一位(其实就是从i处往后不断复制),注意:删除一个元素后,最后一个元素会变得”无意义“,无需特意修改它。数组很大时,耗时长。给定数组元素的地址(首元素的地址)和某个元素的索引,可通过下式计算该元素的内存地址,从而直接访问该元素。一种线性结构,将相同元素存储在连续的内存空间中,元素在数组中的位置称之为索引,即数组下标。原创 2024-03-21 10:17:23 · 462 阅读 · 1 评论 -
cur为链表节点指针,这样执行不报错
这是在刷题时犯得一个错误,我把cur=cur->next;写成了cur-cur->next;一直通过不了,而且没有任何报错信息,经过很长时间检查才发现语句写错了,但是错误的语句在语法上不错!原创 2024-02-28 10:40:32 · 332 阅读 · 1 评论 -
while(--i)与while(i--)的区别
while(i--)可能造成死循环,因为它是先判断i的值,如果i的初值为0,就死循环了,而while(--i)是先执行--操作,再判断,如果i在经过一系列自减操作等于0了,循环结束。的语句执行顺序是:先使用i的值进行条件判断,然后递减i,最后再根据递减前的i值是否为0来决定是否继续执行循环内的代码。的语句执行顺序是:先递减i,然后判断递减后的i是否为0,如果不为0则继续执行循环内的代码,直到i的值为0时结束循环。例如i=5时,while(--i)执行4次循环,而while(i--)执行5次循环。原创 2024-02-28 09:56:58 · 942 阅读 · 1 评论