随笔分类 -  4算法

摘要:输入样例: 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 期望输出: 8 代码实现: #include<bits/stdc++.h> using namespace std; typedef pair<int,int> pii; cons 阅读全文
posted @ 2025-09-23 21:24 小花护符 阅读(9) 评论(0) 推荐(0)
摘要:DFS:广度优先搜索 DFS所使用的数据结构为栈,每次都需要遍历到最底层,无法遍历后回溯到上一层,然后寻找其他分支,直到所有分支都遍历后,再回溯上一层。以此循环。BFS需要记录从开始到结束结点的元素值,以树为例,需要记录根节点到某一叶子结点的元素值,故需要的空间大小为O(h) BFS:深度优先搜索 阅读全文
posted @ 2025-09-20 17:07 小花护符 阅读(13) 评论(0) 推荐(0)
摘要:哈希表 哈希表是把一个比较大的值域映射到一个比较小的空间 哈希表的存储结构: 1.开放寻址法:当出现冲突时,按照顺序将数据存放到数组的下一个位置。2.拉链法:当出现冲突时,在这个位置拉一个链,链上是所有满足这一冲突的元素 哈希表的时间复杂度可以看作O( 1 ),一般只会有添加和查找操作。 字符串的哈 阅读全文
posted @ 2025-09-13 11:34 小花护符 阅读(22) 评论(0) 推荐(0)
摘要:先看手写堆的相关问题:堆排序(手写堆) 五大操作: 例题: 输入样例: 8 I -10 PM I -10 D 1 C 2 8 I 6 PM DM 期望输出: -10 6 代码实现: #include<bits/stdc++.h> using namespace std; const int N =1 阅读全文
posted @ 2025-09-12 19:28 小花护符 阅读(8) 评论(0) 推荐(0)
摘要:堆:一个完全二叉树(上层是满的,最后一层从左向右依次排列) 大根堆:每个点都大于等于他的左右儿子,根节点是集合里的最大值小根堆:每个点都小于等于他的左右儿子,根节点是集合中的最小值 手写堆需要维护的操作: 1.插入一个数(插到数组最后一位然后再调整)2.求集合中的最小值(头节点)3.删除一个数(删除 阅读全文
posted @ 2025-09-08 21:59 小花护符 阅读(15) 评论(0) 推荐(0)
摘要:例题: 输入样例: 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5 预期输出: Yes 2 3 代码实现: #include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int p[N],res[N]; int 阅读全文
posted @ 2025-09-07 22:09 小花护符 阅读(9) 评论(0) 推荐(0)
摘要:并查集 并查集可以快速实现( 时间复杂度近乎 O(1) ): 1.将两个集合合并 2.判断两个元素是否在一个集合中 基本原理:每个集合用一棵树来表示,树根的编号就是这个集合的编号,每个节点存储自身的父节点,用p[x]表示 x 节点的父节点,当p[x]= x时,表示这个结点为根节点。在进行合并操作时, 阅读全文
posted @ 2025-09-06 23:15 小花护符 阅读(19) 评论(0) 推荐(0)
摘要:Trie树 Trie:用来高效存储和查找的字符串集合,从根节点开始依次存储字符串的各个字符, 并在最后一个字符中做出标记表示 以此结束是一个字符串。 例题: 测试样例: 5 I abc Q abc Q ab I ab Q ab 预期输出: 1 0 1 代码实现: #include<bits/stdc 阅读全文
posted @ 2025-09-06 21:15 小花护符 阅读(10) 评论(0) 推荐(0)
摘要:单调队列 单调队列用来求某个固定大小的窗口内的最大值或者最小值问题。 输入样例: 8 3 1 3 -1 -3 5 3 6 7 期望输出: -1 -3 -3 -3 3 3 3 3 5 5 6 7 代码实现: #include<bits/stdc++.h> using namespace std; co 阅读全文
posted @ 2025-05-16 02:58 小花护符 阅读(8) 评论(0) 推荐(0)
摘要:单调栈 单调栈用来解决求数组中每个元素的一侧 第一个比元素本身大或小的数,如果使用常规方式进行两次遍历,时间复杂度是O(n2) 但是使用单调栈来存储,时间复杂度可以优化到 O(n) 思路:以输出每个元素左侧的第一个比他小的数为例; 使用一个栈来存放输入进去的元素, 1.如果输入的数是第一个数,那么左 阅读全文
posted @ 2025-05-16 00:28 小花护符 阅读(19) 评论(0) 推荐(0)
摘要:链表与邻接表 ​ 链表可以采用定义结构体的方式,内部使用指针来实现,但是new Node的操作非常耗费时间,一般采用数组模拟链表的方式 单链表 ​ 单链表中最常用的是邻接表,邻接表可以用来存储树和图 ​ 单链表的一般形式:开始是一个head指针,指向空结点,每个节点中会存放这个节点的值和指向下个结点 阅读全文
posted @ 2025-05-12 18:50 小花护符 阅读(24) 评论(0) 推荐(0)
摘要:前缀和与二维前缀和 前缀和 前缀和的作用主要是用来快速求出 数组中某一连续段落的和 首先需要对前缀和数组进行预处理 S[ i ] 表示前 i 个元素的和,在输入时 S[ i ] = S[ i-1 ] + a[ i ]; 在处理前缀和时下标一般选为 1 — n,因为每次都是用 S[j] - S[i - 阅读全文
posted @ 2025-04-30 02:36 小花护符 阅读(12) 评论(0) 推荐(0)
摘要:二分: 二分的本质是将集合分为连续的两个部分,其中一部分满足条件,而另一部分不满足条件 我们使用二分来找寻满足条件的边界点或者不满足条件的边界点 按照需要寻找的边界点将二分分为两种1.寻找满足某一条件的第一点,即上图绿色区间的左边界点,此时将区间分为[l,mid] 和 [ mid+1 , r] // 阅读全文
posted @ 2025-04-15 16:45 小花护符 阅读(28) 评论(0) 推荐(0)
摘要:题目 思路: 代码: #include<bits/stdc++.h> using namespace std; const int N = 1e6 +10; int n; int q[N],temp[N]; void merge_sort(int q[],int l,int r) { if(l>=r 阅读全文
posted @ 2025-04-14 18:22 小花护符 阅读(7) 评论(0) 推荐(0)
摘要:题目: 思路: 代码实现: #include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int n; int q[N]; void quick_sort(int q[],int l,int r) { if(l>=r) retu 阅读全文
posted @ 2025-04-14 15:17 小花护符 阅读(7) 评论(0) 推荐(0)
摘要:差分:当频繁的对数组内的元素进行区域性性的加减运算的时候使用差分差分数组的第一个值等于源数组的第一个值差分数组的第k个值等于原数组第k个值减去第k-1个值当要让原数组的 [L,R]区域内每个元素都 加/减 c的时候只需要差分数组的[L](+/ -)c,差分数组的[R+1](-/+)c最后原数组的结果 阅读全文
posted @ 2023-04-07 15:36 小花护符 阅读(44) 评论(0) 推荐(0)