数据结构
文章平均质量分 84
数据结构
快乐撸代码
一个今天胜过两个明天
展开
-
单调栈应用
顾名思义 单调栈就是带有单调性质的栈模拟单调栈数组: 4,5,2,6,3 单调递增栈(栈顶小于栈底,元素入栈时,若符合单调性,则入栈,若不符合单调性,栈顶元素出栈,直到符合单调性才入栈):栈为空 ,4入栈 ,栈中为:45大于栈顶(4),4出栈,5入栈,栈中为:52小于栈顶(5),2入栈,栈中为:5,26大于栈顶(2),2出栈,栈中为:5,6仍然大于栈顶(5),5出栈,6入栈,栈中为:6【结束】例题牛客:14666 最优屏障链接:https://ac.nowcode原创 2021-04-30 06:44:34 · 300 阅读 · 0 评论 -
关于二叉树怎样建立和四种遍历方法
文章目录关于二叉树怎样建立和四种遍历方法你知道吗?1. 首先我们要知道二叉树的性质是什么2. 怎样建立二叉搜索树?3. 先序遍历4. 中序遍历5. 后序遍历6. 总结上述三种遍历规律7. 层序遍历关于二叉树怎样建立和四种遍历方法你知道吗?1. 首先我们要知道二叉树的性质是什么 在二叉树上,一个父节点只能有两个子节点。设父节点 a 有一个左子节点b 和一个右子节点 c,那么左子节点的值小于父节点,右子节点的值大于等于父节点 ,也就是 b<a≤c 。2. 怎样建立二叉搜索树?给出一个长为 n原创 2020-10-28 12:08:00 · 471 阅读 · 0 评论 -
Fancy Signal Translate 【二分 + 滚动哈希】
Fancy Signal Translate 【二分 + 滚动哈希】链接:https://ac.nowcoder.com/acm/problem/14270来源:牛客网题目描述FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。但是重点在于,他真的很强!他发明了一种奇特的加密方式,这种加密方式只有OIer才能破解。这种加密方式是这样的:对于一个01串,他会构造另一个01串,使得原串是在新串中没有出现过的最短的串。现在FST已经加密好了一个串,但是他的加密方式有些BUG,原创 2020-10-06 08:33:55 · 296 阅读 · 0 评论 -
线段树空间复杂度为什么是O(4*N-1)?
我们首先设区间长度为 n ,线段树高度为 h;先看下面两种情况:n=8这种情况比较好,正好是一个满二叉树。当区间长度为 8 时,该线段树是一个满二叉树,高度 h = 4也就是 232^323=8,所以 h = log2nlog_2 nlog2n+1n=9当区间长度为 9 时 ,所以 log29log_2 9log29+1 向上取整, 即为 4+1,所以这种情况比较糟糕,不确定第 5 层的节点的位置,所以数组要开大一点: 高度 h = log2nlog_2nlog2n+1+1原创 2020-09-25 19:25:21 · 512 阅读 · 0 评论 -
单调栈
#include<stdio.h>#include<stack>using namespace std;/**单调栈: 递增 入栈时栈顶元素必须大于将要入栈元素,否则栈顶元素出栈 测试*//**查找下一个比当前元素大的元素*//**根据每日气温列表,请重新生成一个列表,对应位置的数值是你需要再等待的天数,经过这些天数后温度才会超过该日温度。如果温度之后都不会再升高,则该位置对应的数值为 0 。例如,给定一个列表 temperatures = [73, 7原创 2020-06-04 11:11:15 · 182 阅读 · 0 评论 -
AVL树
AVL树AVL树是平衡二叉搜索树,比普通二叉搜索树多了一个平衡功能;当一个节点的左子树与右子树的高度差超过1时 ,就被认为是不平衡的。然后通过旋转二叉树维持平衡。插入操作左节点的左子树插入操作(单旋转)插入5号:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bq5KXbX4-1590828107599)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200530155原创 2020-05-30 16:42:03 · 297 阅读 · 0 评论 -
list容器 、数组 模拟栈
list容器 、数组 模拟栈----zoj 4016 Mergeable Stack题意模拟题,给出三种操作:s v 将数字 v 放到 s 栈中s 输出 s 栈顶元素,并删除s t 将栈 t 合并到 栈 s 中,顺序不变这一题数据比较大,所以用stack函数会超时;所以用 list 容器。关于listlist 就是数据结构中的双向链表,内存空间不连续,不支持快速随机存取。begin() 和 end() 即头指针和尾指针push_back () 和 push_front() 在原创 2020-05-28 17:49:21 · 591 阅读 · 0 评论 -
排序算法综合整理
排序算法综合整理文章目录排序算法综合整理一、直接插入排序思想:二、希尔排序思想:三、归并排序怎样求逆序数四、快速排序五、堆排序六、计数排序七、桶排序八、基数排序一、直接插入排序思想:从小到大排序:从第二个数开始,若非递增,则插入前面有序序列中,该位置前面一位小于它,后面一位大于它;二分插入排序:因为前面序列有序,则可用二分找到该位置;用了二分可以减少比较大小的次数撸代码:#include<stdio.h>int main(){ int a[10]={56原创 2020-05-16 20:26:22 · 1073 阅读 · 0 评论 -
POJ--2299 Ultra-QuickSort 归并排序——求逆序数
@归并排序求逆序数题意给一个序列求它的逆序数归并排序给一个序列 9 1 0 5 4,进行归并排序:(从小到大)下标01234数值91054单个元素为一组,两两合并为有序序列:下标0 12 34数值1 ...原创 2020-04-23 15:29:49 · 210 阅读 · 0 评论 -
二分查找
二分查找给一个长为 n 的序列 。查找 x 是否存在,若存在,输出下标和查找次数,否则输出 -1 。**思路:**单纯的查找就行了,一旦找到就跳出循环。撸代码:#include<stdio.h>#include<string.h>int main(){ int n,a[1010]; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]);原创 2020-05-11 16:09:16 · 206 阅读 · 0 评论 -
poj 3274Snowflake Snow Snowflakes 哈希表
@哈希表题意:有 n 个二进制长度为 k 的数字,每一位代表一种特征,分别是0~k 种特征,给的 n 个数化成二进制之后,若第 i 位为1,代表这种特征+1,求最大连续 n 个特征增加相同次数的长度。思路:看数据:7 :1 1 16 :1 1 07 :1 1 12 :0 1 01 :0 0 14 :1 0 02 :0 1 0累加之后:7 :1 1 16 :2 2...原创 2020-04-24 21:32:42 · 161 阅读 · 0 评论 -
链队列——出入队列
首先就是定义一个结构结构体 ,用来装队列的头和尾#include<stdio.h>#include<iostream>using namespace std;struct node{ int data; node *nex;};struct Queue{ node *head=new node; node *rear=...原创 2020-03-24 11:55:50 · 828 阅读 · 0 评论 -
链栈——入栈和出栈
出入栈跟单链表的头插法基本是一样的 ,不过对头插法有了更深的理解 :表头是不动的,初始指向空,插入时,新建的节点真的就在表头与NULL之间插入,以后再插入的时候都是在表头与第一个节点之间插入的。可以参考https://blog.csdn.net/DREAM_yao/article/details/104759320 链表头插法/*链栈的进栈和出栈*/#include<stdi...原创 2020-03-23 18:27:49 · 1928 阅读 · 0 评论 -
双向循环链表——建立
看一张图:结构体有一个前驱指针和一个后继指针,记录一下前后地址就ok了,稍微注意一下指针之间指来指去的,别搞乱。撸代码:/*双向链表的建立*/#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;struct node{ int d...原创 2020-03-19 20:37:16 · 573 阅读 · 0 评论 -
循环链表——建立(设置尾指针)
循环链表设置尾指针可以通过尾指针即时找到头节点 ,便于两个循环链表的合并!撸代码:/*单循环链表是设置尾指针表示 合并循环链表O(1)*/#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;struct node{ int data; ...原创 2020-03-19 19:57:18 · 2657 阅读 · 0 评论 -
循环链表——建立与输出
在建立单链表的基础上注意把 p->next=NULL改为p->next=head;(输出同理)喜欢撸代码:/*循环链表 circular linked list*//*lenth=n*/#include<stdio.h>#include<iostream>using namespace std;struct node{ int da...原创 2020-03-19 16:10:04 · 899 阅读 · 0 评论 -
二维线段树 poj-2155
题意:t组样例 ,输入 n,m,表示n*n的矩阵进行m次操作 ,C: 输入两个坐标 ,组成的矩形 进行取反操作 ,Q:对输的坐标位置输入其值。思路:一开始想的是用1000(表示x轴)个线段树(对每段y进行操作)来记录,也是二维的 ,第一维暴力 ,第二维线段树 ,结果TI ,原来还有二维线段树,每个对应的节点都有一颗线段树(好像跟我的差不多)...原创 2020-03-12 21:55:48 · 134 阅读 · 0 评论 -
(线段树 -星星等级)Stars POJ - 2352
题意:给出n个星星的坐标 x,y ,当存在其他星星的坐标x1,y1满足x>=x1&&y>=y1时 这个星星的等级就加1。注意:题中给的数据是有规律的 ,y是逐渐增加的 ,若y相等时x是逐渐增加的 。思路:~~怎么都没想到是线段树 ~~因为当前给的坐标的yn 一定大于等于之前的y,那么只需要看之前有多少个小于xn 的坐标即可 (说白了就不用考虑y),这一步用...原创 2020-03-11 20:39:24 · 169 阅读 · 0 评论 -
建立单链表——头插法 和 尾插法
因为markdown编译能力有限 ,暂时上图片吧,我觉得也挺方便的又在为自己菜找借口了我看着自己画的图就把代码敲出来了,不算难。上代码:#include<iostream>#include<stdio.h>using namespace std;struct node{ int data; node *nex;};...原创 2020-03-09 19:35:27 · 438 阅读 · 0 评论 -
线段树(区间合并)HDU - 1540
题意:输入n,m,给定n个相互连通的村庄,有m个操作,D x,表示破坏x村庄使其与相邻的两个村庄不相通,R 表示修复上一个被破坏的村庄,与相邻的两个村庄联通。Q x表示与x相连的村庄有多少个。思路:一开始只知道是线段树,想着肯定得用结构体记录每个点的信息,怎么记录就不知道了。然后学了线段树区间合并。首先要知道结构体记录的信息,当前区间 的左右边界、 左右边最大连续区间、总的最大连续区间 ...原创 2020-03-04 23:13:48 · 199 阅读 · 0 评论 -
两个有序链表的合并
给两组有序链表,都是以-1结尾,将两个有序链表合为一个有序链表并输出。注意: 这里面是将a,b两链表合并到a的表头里面了#include<bits/stdc++.h>using namespace std;struct node{ int data; node *nex;};void input(node *head){ node *p; ...原创 2020-03-02 21:45:35 · 153 阅读 · 0 评论 -
单链表的输入、输出、插入和删除
首先简单的存入一组连续的数据,以 -1 结束思路:**输入:**申请一个表头的空间 a,并且 a->next 初始为NULL,在表头不存储数据信息,只用来指向链表的头部!(个人认为方便之处在于,判断a->next是否为空即可得知接下来有没有有效信息)用一个临时的指针p,去指向链表的尾部,存储时,申请空间,造出表尾,用原来表尾的next去连接这个新的表尾。**输出:**用循环不断从...原创 2020-03-02 20:06:55 · 5854 阅读 · 0 评论 -
单调队列
典型例题:滑动窗口给一个长度为n的序列,k为一个滑动窗口的长度,从1开始向n滑动,问在窗口内的最大值和最小值这篇博客模拟的很不错https://blog.csdn.net/ljd201724114126/article/details/80663855模拟了一遍,感觉知道了那个过程,就是不知道怎么讲出来,只能去模拟感受过程了。...原创 2020-02-19 20:20:42 · 145 阅读 · 0 评论 -
Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了)。思路:很明显就是线段树更改区间,不过这个区间的跨度有点大(看数据),不过n<10000,所以就可以把这些广告牌的边界重新定义编号,比如:n输入 21 62 13排序以后,1还是1,2还是2,6就可以看成3,13就可以看成4...原创 2019-12-15 21:06:20 · 261 阅读 · 0 评论 -
字典树模板 HDU - 1251
题意:给一些单词,换行键后,查找以后输入的单词作为前缀的话们在之前出现过几次。思路:字典树模板----像查字典的顺序一样#include<string>#include<stdio.h>#include<iostream>using namespace std;struct tire_node{ int count;//前缀出现的次数...原创 2019-09-23 19:57:18 · 147 阅读 · 0 评论 -
HDU - 1622 用到了层次遍历
题意:给出一些字符串,由(,)包着,表示一个节点,逗号前面是节点的值,后面是节点从根节点走向自己位置的路线,输入以( )结尾,如果这组数据可以构成一个完整的树,输出层次遍历结果,否则输出not complete,即不是一个完整的树 或者有的点被覆盖了多次。思路:按照路径字符串的长短从小到大排序,然后建立二叉树,最后进行层次遍历,看能遍历到多少个点,如果遍历到的点与输入的点的个数相同,则输出层...原创 2019-08-08 20:45:02 · 451 阅读 · 1 评论 -
POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)
题意:给定一个数字n,表示这段区间的总长度。然后输入n个数,然后输入q,然后输入a,b,表示查询a,b,区间和,或者输入c 再输入三个数字a,b,c,更改a,b区间为c思路:线段树首先就是递归建树,可以从左子树开始,将数据输入到叶子节点上。当左区间等于右区间的时候就是叶子节点。在回溯的时候,父亲节点的值根据左右儿子得出值。区间修改的时候需要用到一个懒惰标记,当前走到的区间如果完全被需要修...原创 2019-08-04 19:21:04 · 404 阅读 · 0 评论 -
HDU - 1166 树状数组模板(线段树也写了一遍)
题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以)思路:树状数组的单点查询,单点修改和区间查询。树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改。这里面用到一个lowbit的概念,将数的下标转化为二进制。找到值为1的最低位。前面的数舍去,判断这个数为几,那么这个数组的当前下标储存的值从这个下标开始往前的前几项和。不是特别懂,先拿来用了在树状数组里面求区间...原创 2019-08-04 19:31:26 · 143 阅读 · 0 评论 -
HDU - 3791 建立二叉搜索树
题意:给定一个序列,下面又有n个序列,判断这个序列和其他序列是否为同一个二叉树(同一序列数字各不相同)思路:首先讲将一个序列建立成二叉搜索树,然后将其他序列也建立二叉搜索树,两个树进行前序遍历,看他们的结果是否完全相同。二叉搜索树概念: 左儿子小于父亲节点,父亲节点小于等于右儿子#include<stdio.h>#include<iostream>using ...原创 2019-08-08 19:41:53 · 243 阅读 · 0 评论 -
UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)
题意:同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和。想法:一开始想着建树,但是没有这样建过,周赛题又出了一遍,没办法,后来尝试了一下,真的建出来了,也不难。建树--->遍历二叉树----->over注意: 这里必须是多组输入,否则就错了,记得吸收空格。关于 先...原创 2019-08-08 20:11:35 · 220 阅读 · 0 评论