
算法
本专栏收纳和链表、二叉树相关的算法解答
丁世光
在校生,编程语言掌握C/C++、Python,熟悉常见数据结构,Linux系统指令、文件管理、进程管理、线程管理,网络套接字编程,了解网络字符串的序列化和反序列化,tcp协议和udp协议,MySQL语句
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数组——调整奇偶数顺序
实现上述要求,可以从左边向右找偶数,同时,从右边向左边找奇数,然后交换,这样,奇数被调整到了前面。题目描述:有一个整型数组,要求调整顺序,使得奇数全部位于偶数前面。原创 2023-03-21 08:50:20 · 167 阅读 · 1 评论 -
算法——同步算法
后面步骤省略,结束条件是有一个遍历结束,则结束。另一个剩余元素则push到差集。,与此类似的还有求差集,相关的解法有很多。通过这道题,引出被广泛应用的同步算法。数据同步算法最常见的应用就是手机云存储。应用需求:要求同时求出差集和交集。2.依次比较,比较结果是小的就push到差集。1.同时遍历两个数组(也可以是其他)3.比较结果相同的就push到交集。4.比较结果不相等时,值为小的++,遍历数组插入set即可去重。5.比较结果相等时,同时++原创 2024-07-08 11:45:07 · 400 阅读 · 0 评论 -
链表——随机链表的复制
再遍历原链表,此时,通过基于map重载的[]运算符,可以返回原链表结点random对应的V即复制结点。过去的算法是修改原链表的next,让每个复制结点位于原链表结点后面。这道题的关键在于完成链表复制后,如何修改random指针。map 的结点为 K原链表结点和V复制链表结点。基于这篇文章算法的改进。原创 2024-07-08 11:05:14 · 436 阅读 · 0 评论 -
算法——求一个二进制数中1的个数
有点类似求我们平时求某个数的每一位(二进制的每一位不就是0/1吗)but 当你输入-1时。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(沉默了吧,可能没法达到我们原创 2022-12-13 19:13:21 · 116 阅读 · 0 评论 -
字符串——字符串相加
这里提一下怎么插入字符串,由于加法的规则,每次得到的结果是尾部的数据,所以,需要不断的头插来保证字符的顺序正确,但是头插需要挪动数据(string底层是顺序表),所以效率大打折扣,可以通过尾插O(1)来,然后逆置字符串来替代这种算法。要处理字符串相加,大致想法是,按照加法对齐,将单个字符用整型表示,相加后将结果分解为进位0或1和某个数字,然后将该数字用字符形式存进字符串。需要把end1和end2指向的字符转化为数字(减字符0),然后相加,结果是一个整型。按照加法对齐,用双指针的形式来遍历相加。原创 2023-12-19 18:43:20 · 1012 阅读 · 0 评论 -
链表——链表的回文结构
找中间节点,用快慢指针,slow即中间节点,无论是奇数还是偶数个节点,这个方法找到的就是符合条件的中间节点。反转后一半链表,用经典的头插法,需要一个新的头,slow还是指向原来的中间节点,所以不去操作slow。此时slow还是指向中间节点,这样就可以有比较的结束条件了。第二步:把中间节点后面的所有数逆转,即反转链表。第三步:O(N)遍历比较。第一步:找到中间节点。比如:1 2 2 1。原创 2023-08-08 20:56:15 · 79 阅读 · 0 评论 -
树——左叶子之和
二叉树遍历问题罢了。定义一个sum,sum理解为每个节点都有一个sum,sum就是以这个节点为根的树的左叶子之和。故可以理解为对于求这棵树的sum,就是求节点的sum = 左树的sum + 右树的sum。这是递归条件。还有结束递归条件:就是左子是叶子节点,就把左叶子值加入sum。这样就能递归到叶子节点,返回空。我觉得这个不好理解,我再写一个⑧。原创 2023-10-16 22:51:01 · 74 阅读 · 0 评论 -
链表——带环链表的入环节点
slow一次走一步,fast一次走两步,差距步是1,1可以整除任何数,所以不会出现超过的情况 ,假设在meet相遇,此时有关系:fast路程是slow的二倍。3.因为是通过fast和slow是否会相遇来判断有无环的情况,所以在判断链表为有环的同时可以马上标记meet。2.先通过fast走两步,slow走一步来找到fast和slow相遇的点meet。1.先判断有没有环,没环直接return NULL;4.然后meet走,再用一个指针从头走,相等点即入口点。原创 2023-08-17 17:18:07 · 120 阅读 · 0 评论 -
链表——相交链表O(N)解法
1.先判断两个链表是否相交,通过判断尾节点是否相同来判断是否相交,而且遍历找尾的同时分别记录下两个链表的长度lenA,lenB。2.不相交返回NULL。相交的话,让长的先走差距步,然后两个同时走,第一个相等的节点即所求节点。原创 2023-08-13 10:46:03 · 77 阅读 · 0 评论 -
算法——常见排序算法
其思想与玩扑克牌时将一张牌插入哪里时相似:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。选择排序的思想就是选择最大或最小:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。右边找小,如果是右边去和L相遇,L的位置是小的吧,因为L在找大,找大就会交换,所以L所在位置一定是比key小的。关于Shell的复杂度,由gap影响,很复杂,这里直接记住,最好的情况是O(n^1.3)。原创 2023-10-17 17:11:44 · 79 阅读 · 0 评论 -
链表——复制随机指针链表 O(N)解法
因为复制节点在原节点后面所以,原节点random所指向的节点对应在复制链表中的节点就在下一个。用copy指针维护复制链表,每malloc一个就插入到对应原链表节点的后面,这么做是为了方便找random,复制节点在原节点的后面。复制链表:题目要求复制原来的链表,返回复制链表的头。把复制节点插入原链表:把复制节点插入对应原节点后面。解释:这个题的关键在于怎么修改复制节点的随机指针。第二步:改变复制节点的random。第三步:还原原链表,连接复制链表。复制节点:复制链表的节点。原创 2023-08-26 21:04:06 · 129 阅读 · 0 评论 -
链表——移除链表元素
两个指针一前一后走,如果cur->data==val,让prev指向val所在节点的下一个即可。但是如果val是头节点,另外操作就好了。原创 2023-08-06 18:07:07 · 66 阅读 · 0 评论 -
链表——合并两个有序链表
两个链表两两比较,拿小的用来尾插。既然要尾插,就需要一个尾,这样就不用每次都找尾。原创 2023-08-07 11:04:32 · 60 阅读 · 0 评论 -
数组——删除有序数组的重复项
我们依此比较cur和dst指向的值,如果相等,则cur往后走,如果不相等,dst走到下一位再将cur代表的值给dst,直到cur遍历结束。双指针思维模式:dst维护的是我们要求的那个数组,再来一个cur用来遍历原数组,我们可以直接在原数组上修改。cur和dst都从头开始,或者cur比dst后一位。因为在原数组修改,我们用下标“指针”。原创 2023-08-02 18:01:45 · 67 阅读 · 0 评论 -
链表——链表分割
将小的尾插得到Less链表,则需要尾指针tail,考虑极端情况,如果原链表的val都大于x,那么Less链表为空,tail==NULL,这样不能连接两个链表,只能返回第二个链表,与此同时,代码量也会增加,为了方便,如果链接的两个链表带哨兵位,则会容易许多。将小于x的节点做成一条Less链表,大于x的做成另一条More链表,然后将两个链表连接。那么接下来,让lesstail->next = morehead->next。但是moretail还没处理,需要置空。原创 2023-08-07 18:40:30 · 80 阅读 · 0 评论 -
链表——约瑟夫环形链表
prev可以放心给NULL,报数不会为1,第一次循环一定是进else。循环条件的设计很巧妙。只要报数不为1,那么最后都只剩下一个节点。单向环链表,尾的next为头。原创 2023-10-17 17:03:09 · 62 阅读 · 0 评论