数据结构基础
不可知论大祭司
Know how to solve every problem that has been solved.
展开
-
LuoguP2922 [USACO08DEC]Secret Message G 01Trie
code /* LuoguP2992 同时维护01字典树每个节点经过的次数 以及用f[N]对结尾标记 */ #include <iostream> #include <algorithm> #include <cstdio> using namespace std; inline int read(){ int x = 0, op = 1; char ch = getchar(); while (!isdigit(ch)){ if (ch == '-原创 2021-03-20 08:56:10 · 96 阅读 · 0 评论 -
P1823 [COI2007] Patrik 音乐会的等待 单调栈
单调栈 链接 栈底维护的是目前身高最高的人,因为在此人前的人因为此人的存在不能与后来的人联系了,所以如果遇到身高高的人就不断让比他身高矮的人出栈即可。不过我们还要留意身高相同的情况。 由于要考虑重复的情况,用单调队列时将高度相同的人挤掉(统计答案)之后还要再加上去,这种情况遇到所有人身高相同的时候就退化成了O(n^2)的算法了,T了三个点。 #include <cstdio> #include <algorithm> #include <cstring> #include原创 2021-01-22 21:13:36 · 204 阅读 · 0 评论 -
【P2947】 [USACO09MAR]Look Up S单调栈
链接 code #include <cstdio> #include <algorithm> #include <cstring> #include <cctype> #include <vector> #include <iostream> #include <map> using namespace std; inline int read(){ int x = 0, op = 1; char ch = ge.原创 2021-01-22 19:20:34 · 222 阅读 · 0 评论 -
Leetcode867链表的中间节点
代码 快慢指针法,实际上操作起来很简单的。就是让快指针一次移动的速度是慢指针的两倍,最后返回慢指针的位置即可。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode middleNode原创 2020-12-30 08:14:31 · 87 阅读 · 0 评论 -
Leetcode206反转链表
代码 这种一边遍历一边改next的做法的确很方便,速度也很快。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList(ListNode head) {原创 2020-12-29 22:18:57 · 85 阅读 · 0 评论 -
约瑟夫环 模拟单向链表实现
#include <cstdio> const int N = 301; int n, m, sum; int nxt[N]; int main(){ scanf("%d%d", &n, &m); if (m == 1){printf("%d\n", n); return 0;} for (int i = 1; i <= n; ++i) nxt[i] = i + 1; nxt[n] = 1; int ind原创 2020-12-25 20:33:27 · 94 阅读 · 0 评论 -
【POI2014】KUR-Couriers 主席树
LuoguP3834 题目链接分析代码 题目链接 传送门 分析 给一个长度为 n 的正整数序列 a。共有 m 组询问,每次询问一个区间 [l,r]是否存在一个数在 [l,r] 中出现的次数严格大于一半。如果存在,输出这个数,否则输出 0。 刚刚学主席树,与区间地k大类似,只需要把k变成严格大雨区间长度一半的数,分别统计小于和大于mid的数字的个数,如果这个数比k小的话就不需要继续向下访问了,由于是用vector存离散化后的结果的,要注意一下下标。 代码 #include <iostream> #原创 2020-12-20 21:17:20 · 149 阅读 · 0 评论 -
【P1886】 滑动窗口 单调队列
滑动窗口题目描述链接代码 题目描述 有一个长为 n 的序列 a以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 链接 传送门 代码 这里用了用双端队列实现的单调队列,以维护最大值为例。新的元素与队尾相比如果大就让队尾处队,同时我们还需要考虑窗口大小的限制,如果队尾和队首序号差大于等于k的话就就要缩小窗口,即让队首出队,这样就可以维护大小为k的窗口的最大值,时间复杂度是O(n),用双端队列实现也比较简单,在这个特定问题上的确要比线段树要更优。 #原创 2020-12-12 18:53:34 · 300 阅读 · 0 评论 -
hdu1710二叉树遍历
//hud1710 #include <iostream> #include <cstdio> using namespace std; const int N = 1010; int pre[N], in[N], post[N]; int k; struct node{ int val; node * l, * r; node(int val = 0, node * l = NULL, node * r = NULL): val(val), l(l), r原创 2020-12-11 17:14:48 · 249 阅读 · 0 评论 -
二叉树的三种遍历(递归实现)
二叉树的三种遍历遍历方法节点代码实现建树操作三种遍历方式释放内存完整代码样例 遍历方法 前序遍历 根左右 中序遍历 左根右 后序遍历 左右根 虽然二叉树的三种遍历有非递归实现的方法,而且时间复杂度较更小,但是递归实现代码简洁,并且有助于理解三种遍历的方式,所以这里采用了递归写法。 节点 用结构体表示一个节点 struct node{ char data; node* lson; node* rson; }; typedef struct node Node; 代码实现 建树操原创 2020-12-09 22:23:02 · 622 阅读 · 0 评论 -
单向链表 C语言实现
链表 时间复杂度 类型 数组 链表 查找 O(1) O(n) 插入 O(n) O(1) 删除 O(n) O(1) 链表的节点 struct node{ int data; struct node* nxt; }; typedef struct node Node; 顺序创建链表 Node* createLinkList(int n){ Node* head = (Node*) malloc(sizeof(Node)); Node* end =原创 2020-12-04 10:30:26 · 208 阅读 · 0 评论