
漫话算法
关于数据结构和算法的详细讲解就在这里
c栈算法小辰哥
华中农学院的大二计科,陪伴和爱着每一个支持我和帮助我的人
展开
-
算法思考:位运算
两个性质,第一个是奇数的1的个数是它二分之一的数的1的个数加一,偶数则相同,另一个是一个数1的个数比它&它-1的1的个数多1。1的个数,可以利用&有0就是 0的性质,可以让数每次右移一位与1做&运算,如果最后一位为1则是1,否则是0。2.计算从1到n中所有数二进制中1的个数,列成数组。使用^的性质,一个数^自己为0,一个数^0为该数。位图,统计两个字符串相同英文字母的个数。异或和的应用,两个消失的数字。^:相同为0,相异为1。1.求一个数1的个数。原创 2025-02-16 20:58:15 · 192 阅读 · 0 评论 -
算法思考:非0整数除法
除法,很明显就是循环嘛,那么如何进一步提升效率?就是跳过多余的循环步骤比如15/2,原先是1+1+1+1+1+1+1再余1,现在尽量每次除2的最大倍数,将结果变为4+3+1,将时间由n方减为logn。2.坑点:负数可以到-2的31次方,正数只能到2的31次方-1,防止溢出,设计时就要考虑负数的除法再套用正数情况,而不是相反。这是一道很简单的问题,但是我们可以有更多的思考。3.剩下的就是各种相反数。原创 2025-02-15 22:10:44 · 266 阅读 · 0 评论 -
华农专业课拯救计划:csf202303
聊聊心路历程:这道题首先看见一堆公式就头大了,但是看到题干就想当一个贪心的男人,首先选择贪心策略(也没啥选的):把资源给天数的最多的,再选择map作为存储器,也可以用vector<pair>加迭代器排序,但是我想用map因为懒得写迭代器排序,首先这是一个降序排序,原因是根据贪心策略要开始从天数多的开始,在有资源且最低天数大于k的时候进行,首先看一看能不能给天数多的降一个档,能就更新一下各种变量,头删一下,不能降档就算一下能减几天,如果一开始就满足要求,就打印最多的天数。第三题(我不会,我不会......)原创 2024-10-06 10:59:38 · 221 阅读 · 1 评论 -
华农专业课拯救计划:ccf,csp题组训练第一周
主函数:输入节点数和区域数,更新signnum,再输入要求数量,设置一个循环(fi表示有几个要求相同的点),设置两个哈希表分别对应符合两个要求和三个要求,遍历计算节点,更新两个哈希表的内容,然后根据题目中给定的排序操作,把符合条件的点进行排序(pair默认先排first再排second,把任务最少的计算节点挑出来作为结果,然后更新app和tasknum数组)首先要理清题目中的关系,一个应用有多个计算任务,不同的计算任务要在一些计算区域上进行,可能对区域或者区域中的应用有要求,现在要解决这些要求。原创 2024-09-19 15:16:15 · 346 阅读 · 0 评论 -
acwing5407管道:对题解的理解
3.主函数暴力:从0到2*len(我试了m不成功)枚举每一个时间,直到水管灌满,但是由于数据太多超时了,而想要优化枚举,只有滑动窗口,二分,双指针三条路,很明显只剩下二分,所以这道题要用二分优化(很多人看到这道题用二分会很突兀,确实这道题乍一看跟二分一点关系没有,只不过由于数据太大越界了才不得已选择了二分)5.二分模板选择:找左,找右,找中,由于找第一次灌满的时间在右侧区间最左侧,且中间点,左侧,右侧不具有三段性,所以不找中,不找右,找左。记录的区间分别是[1,4],[6,9]但是又有一种新的情况。原创 2024-09-11 18:33:14 · 435 阅读 · 2 评论 -
用哈希封装unordered_map和unordered_set
我们称set的begin为A,哈希的begin为B,A的实现是对B的调用,在A的参数是普通迭代器时,B也是普通迭代器,B的返回值也是普通迭代器,但A的返回值是const迭代器,所以这里需要用普通迭代器创建一个const迭代器的临时变量,这就用到之前写的拷贝构造函数了。2.unordered_map不允许修改key,故普通迭代器和const的pair中的K都要加上const修饰,但是允许修改存储的data,所以普通和const迭代器一一对应。返回类型是迭代器,运用一个仿函数来寻找。后置++就是调用前置++原创 2024-08-12 10:54:29 · 189 阅读 · 1 评论 -
哈希表详解
5.哈希冲突的问题:1.当两个不同的键值被映射到同一个槽位时,其中一个键值的数据可能会被覆盖2.在发生冲突的槽位中,需要通过额外的操作来查找目标键值,这会增加查找的时间复杂度3.频繁的哈希冲突会导致哈希表的装载因子增加,使得哈希表的性能下降。2.直接地址法:key=key*A+B:优点:简单均匀,缺点:需要知道数据的分布状况,不然容易越界,一般在查找小且连续的情况下。2.哈希函数是数据映射的规则,有以下特征:1.其对应的散列表必须存储全部数据,数据的范围必须在散列表的范围中2.分布应该是均匀分布3.简单。原创 2024-08-10 21:39:04 · 490 阅读 · 0 评论 -
红黑树封装
迭代器分为两种,普通和const类型,所以它们的返回参数不能一样,为了它们俩可以调用同一个函数,将类模板的参数设置为3个,其中Ref代表const T&,Ptr代表const T*一个是不可修改即二叉搜索树的性质,一个是返回值不可修改即二叉树查找的性质。begin()返回的迭代器类型是const类型,但是红黑树里面的begin返回的是普通类型,所以要拷贝构造,进行类型转换。set的key不允许修改,所以set的迭代器和const迭代器的底层都是红黑树的const迭代器。2.模板参数第一个为K代表参数类型。原创 2024-08-09 20:48:39 · 279 阅读 · 0 评论 -
一文带你搞懂红黑树的基本操作
1.每个节点只有红色和黑色两种形态2.根节点是黑色的3.如果一个节点是红色的,那么它的两个孩子是黑色的,也就是一条路径不存在连续的红色节点4.对于每个节点,从该节点到其后代的简单路径上均包含数目相同的黑色节点5.每个空节点都是黑色的6.最长路径的节点不超过最短的两倍(最短为纯黑节点)原创 2024-08-02 21:36:12 · 333 阅读 · 0 评论 -
力扣树层去重:子集2
当我们发现相同的数字出现时不用再进一次循环时,会用到以下格式。原创 2024-07-15 19:48:19 · 298 阅读 · 3 评论 -
力扣字符串回溯:复原ip地址
【代码】力扣字符串回溯:复原ip地址。原创 2024-07-15 18:40:08 · 241 阅读 · 3 评论 -
力扣回溯:分割回文串
里面要用到字符串转换函数substr。原创 2024-07-15 08:46:02 · 202 阅读 · 3 评论 -
力扣40:组合总和2
这道题的关键在于每个数字只能出现一次,说明排序后如果有重复项则跳过,也可以在排序后直接对数组进行去重。原创 2024-07-14 08:41:56 · 311 阅读 · 3 评论 -
力扣回溯:组合总和3
这道题注意回溯的步骤:递归出口,单次操作,恢复现场。原创 2024-07-14 08:06:18 · 234 阅读 · 3 评论 -
avl树的二分构建:将有序数组转化为二叉搜索树
2.avl的构建一般采用二分的方法,类似于快排递归格式。原创 2024-07-14 07:38:03 · 264 阅读 · 3 评论 -
力扣递归思路题:修剪二叉搜索树
这个题非常考验递归思路和二叉搜索树的性质。原创 2024-07-13 21:50:13 · 210 阅读 · 3 评论 -
力扣常规题:删除二叉搜索树中的节点
【代码】力扣常规题:删除二叉搜索树中的节点。原创 2024-07-13 19:32:26 · 279 阅读 · 3 评论 -
力扣简单题:二叉搜索树的插入操作
【代码】力扣简单题:二叉搜索树的插入操作。原创 2024-07-13 19:06:28 · 241 阅读 · 3 评论 -
力扣相似题:二叉搜索树的最近公共祖先
2.与二叉树的最近公共祖先极其类似,就是将左支右支的判断条件改成了二叉搜索树的性质。原创 2024-07-13 18:49:17 · 311 阅读 · 3 评论 -
力扣容器题:二叉搜索树中的众数
容器操作和sort函数的格式。原创 2024-07-13 17:39:46 · 271 阅读 · 3 评论 -
二叉搜索树性质的应用:二叉树的最小绝对差
2.注意模板:二叉树绝对值差值最小的只可能是本节点和上一个节点,可以通过列举得出。原创 2024-07-13 10:24:15 · 258 阅读 · 3 评论 -
力扣深搜:路径总和2
【代码】力扣深搜:路径总和2。原创 2024-07-13 09:49:03 · 238 阅读 · 3 评论 -
力扣高难:接雨水
这下就要使用程序优化的方法了,用变量记录每一次改变的值,采用动态规划的方法优化程序。2.思路很简单,左边最大柱子和右边最大柱子的最小值减当前高度就行了。原创 2024-07-12 10:52:57 · 196 阅读 · 4 评论 -
一道题带你熟练优先队列:前k个高频元素
2.题目中前k个,就很明显的提示了我们这是堆的topk问题,所以要使用优先队列,而这种统计频率的题肯定要使用哈希表去重,所以用了unordered_map,由于优先队列默认是大堆,而我们要建大堆,但是元素不是简单的数据,而是pair的second进行比较,所以还是要采取(数据类型,存储容器,自定义比较类/比较函数)的格式。原创 2024-07-12 09:20:52 · 214 阅读 · 4 评论 -
力扣优先队列的应用:滑动窗口最大值
2.经验总结:看到类似单调性的题使用优先队列是不错的选择,这道题的解题有三个步骤:1,将滑动窗口的最后一个元素删除,但是注意,因为只有队头的元素对结果有影响,所以删除也只删除队头元素2.在入队列前删去所有比该元素小的值,因为已经有生命周期更长,更大的值出现,之前的所有小值已经没有存在的必要,所以删除即可(每个小值存在的窗口,即将进入队列的大值也必然存在)3.入队列和更新结果。原创 2024-07-12 07:24:45 · 234 阅读 · 3 评论 -
灵活运用数据结构来解决问题:反转字符串中的单词
2.常规解法:双指针,但是过于复杂我就不赘述了。3.自创方法:把单词写在链表里,反转链表即可。原创 2024-07-11 18:57:08 · 205 阅读 · 2 评论 -
哈希表容器的应用:求多数之和
2.先来看一看三种容器的特点:set的key有序,key不可重复,key不可修改,运行慢,map的key有序,key可重复,运行慢,unordered_map的key无序,不可重复,不可修改,运行快。我的思路是:先遍历前两个,把对应值和值的数量存在哈希表里,然后从后两个找与其相反的值。3.题目简单,以下为代码。原创 2024-07-11 16:05:04 · 248 阅读 · 2 评论 -
力扣难题:螺旋矩阵2
3.解题思路:总圈数等于n/2,每次圈长-1,圈每次是上下左右四条边,起始点分别为00,11,22.......,如果是奇数则最后在中间把n补上。2.做题第一步:模拟画图,这道题如果没有规律就会非常难做。3.从外到内的每一个圈的结构都是一样的。2.奇数去掉中间点恰好比偶数少一个圈。1.奇数和偶数的圈的结构明显不一样。4.每次圈的长度都减一。原创 2024-07-11 09:55:45 · 340 阅读 · 2 评论 -
数据结构考前背代码:模拟卷,哈夫曼
【代码】数据结构考前背代码:模拟卷,哈夫曼。原创 2024-06-24 20:44:15 · 169 阅读 · 3 评论 -
数据结构期末背代码5:快速排序,堆排序
【代码】数据结构期末背代码5:快速排序,堆排序。原创 2024-06-20 18:38:49 · 199 阅读 · 1 评论 -
数据结构考前背代码4:二叉树的七种遍历和三种构建
【代码】数据结构考前背代码4:二叉树的七种遍历和三种构建。原创 2024-06-18 16:00:07 · 172 阅读 · 3 评论 -
数据结构考前背代码2:哈夫曼,希尔排序,拓扑排序
【代码】数据结构考前背代码2:哈夫曼,希尔排序,拓扑排序。原创 2024-06-17 08:50:50 · 223 阅读 · 3 评论 -
数据结构考前背代码1:最小生成树,插入排序,循环队列约瑟夫
3.循环队列实现约瑟夫环。原创 2024-06-15 10:16:34 · 194 阅读 · 2 评论 -
华农专业课拯救计划:模拟卷
现输入一组数据,以0作为输入的结束,从插入排序、希尔排序、快速排序、堆排序四种排序方法中挑选一种稳定的排序算法,对输入的数据进行从大到小的排序,给出排序后的结果。可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边的权值表示相应的代价。注意点:稳定的算法:冒泡,插入,归并,不稳定:快排,希尔,堆,时间复杂度为nlongn的为堆,归并,快排,除了希尔剩余为n方,且希尔介于二者之间,而赶时间选快排,省空间选堆排,稳定性归排,原创 2024-06-15 08:24:21 · 805 阅读 · 2 评论 -
数据结构实验期末押题卷2
1.链表:输出倒数第k个节点。3.哈夫曼树与哈夫曼编码。2.二叉树:层序遍历。原创 2024-05-30 22:04:50 · 159 阅读 · 3 评论 -
数据结构实验期末押题卷1
3.二叉树:两种遍历建树以及寻找共同祖先。4.图论:图的连通性与深度优先搜素。2.栈和队列:使用两个栈实现队列。1.链表部分:反转链表。原创 2024-05-29 18:02:57 · 214 阅读 · 3 评论 -
数据结构期末拯救计划:图的高阶算法
首先是一个常规的邻接表的存储方式,表示边的node数组以及头节点数组,in代表入度,data代表顶点数据,flag代表是否已经排序,edge代表边,再来解析排序本体,首先是排序数组res和邻接表G,首先定义一个栈,并且当点的入度为0时(表示是顶点),则入栈,当栈不为空的时候,提取栈顶元素并出栈,并将栈顶元素加入到res中,然后把这个顶点的边拿出来,让边的终点的入度减1,然后再对邻接表进行遍历,如果有新的入度为0的节点存在则重新入栈,然后就是邻接表的创建。当i和j相等的时候,保证对应的整数为0。原创 2024-05-29 08:37:26 · 1002 阅读 · 3 评论 -
数据结构期末拯救计划:图的初阶应用(重点)
图的深度优先遍历,和普通的深度优先搜素一样,设置一个以形参引用形式的visit数组,以及引用形式的vector数组,以及位置pos(从1开始),注意为了从1开始,要多存储一个节点,递归出口为该节点以访问,每次打印数据都将visit的该位置赋值为true,再沿第一个节点的边进行遍历,如果边未访问则访问边,否则继续遍历。警察抓到了 n 个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。原创 2024-05-24 16:54:43 · 400 阅读 · 3 评论 -
数据结构期末拯救计划:哈夫曼树与哈夫曼编码
现在来解析两个函数,outpom为输出哈夫曼编码,limit为树根节点所在位置,pos为查找位置,从查找位置的父节点开始打印,如果pos是左节点打印0,是右节点打印1,然后向上继续查找(哈夫曼编码为从根节点到子节点的路径),由于以上原因,要反向打印,翻译函数解析如下:next为树根位置,输入哈夫曼编码,再遍历,寻找从根到给定节点的路径,如果为0则移向左孩子,如果为1则移向右孩子,如果已经移动到叶子节点则打印该点的字母编号,并将next回退到根节点位置。另,求解某字符串的哈夫曼编码,求解某01序列的译码。原创 2024-05-23 19:43:06 · 560 阅读 · 3 评论 -
数据结构期末拯救计划:树的线索化和树状打印
思路:set函数,使用一个前驱节点以改变left,如果根节点为空则返回,左节点为空则赋值前驱节点,如果前驱节点的右节点为空且前驱节点不为空,将它的后继节点赋值为当前根节点,并且更新前驱节点为当前节点,前序打印的思路首先找到最左侧且不是线索节点的节点,并且打印数据,饭后一直打印后继节点,并且结束后让根节点移动到右节点,creat就是按普通二叉树的构建。【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树。【输入形式】二叉树拓展的前序遍历序列。【输出形式】中序遍历序列。原创 2024-05-23 09:06:17 · 154 阅读 · 3 评论