随笔分类 - 算法
分享必须掌握的高频算法
摘要:单调队列 应用:求滑动窗口的最大最小值 给定一个大小为 n≤106 的数组。 有一个大小为 kk 的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。 窗口位置
阅读全文
摘要:单调栈 给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。 输入格式 第一行包含整数 N,表示数列长度。 第二行包含 N 个整数,表示整数数列。 输出格式 共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
阅读全文
摘要:实现一个单链表,链表初始为空,支持三种操作: 向链表头插入一个数; 删除第 k 个插入的数后面的数; 在第 k 个插入的数后插入一个数。 现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了
阅读全文
摘要:离散化 值域比较大 : 0 109 个数少: 0 105 例题 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]之间的所有数的和。
阅读全文
摘要:区间合并 应用场景 给定多个区间,如果区间之间有交集那么就结合到一起 给定 nn 个区间 [li,ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3] 和 [2,6] 可以合并为一个区间[1,6]。 输入格式 第一行包含整数 n。 接下
阅读全文
摘要:位运算常用的两个操作: n的二进制表示中第k位是几 n = 15 = (1111)2 #include<bits/stdc++.h> //万能头文件 using namespace std; int main() { int n = 10; //1010 for (int k = 3; k >= 0
阅读全文
摘要:快速选择算法 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼109范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1
阅读全文
摘要:###双指针算法: 核心思想就是缩减时间复杂度 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { 时间复杂度是O(n * n) } } 双指针模板 for (i = 0; j = 0; j < n; j++) { while (j
阅读全文
摘要:###差分 a1, a2, a3 ...... an a称为b的前缀和 构造b1, b2, b3 ..... bn b称为a的差分 使得 ai = b1 + b2 .... + bi 方法: b1 = a1 b2 = a2 - a1 b3 = a3 - a2 .... bn = an - an-1
阅读全文
摘要:前缀和: 例如原数组 a1 , a2 , a3 , ..... an 前缀和:Si = a1 + a2 + a3 + ... + ai 1、如何求Si for i = 1; i ⇐ n; i++ s[i] = s[i-1] + ai 2、作用:求数组中某段的合 [l, r] 普通方法时间复杂度是O(
阅读全文
摘要:##高精度加法模板 例题: 给定两个正整数,计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的和。 数据范围 1≤整数长度≤100000 输入样例: 12 23 输出样例: 35 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:##高精度减法模板 给定两个正整数,计算它们的差,计算结果可能为负数。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的差。 数据范围 1≤整数长度≤105 输入样例: 32 11 输出样例: 21 #include<bits/stdc++.h> //万能头文件 using nam
阅读全文
摘要:归并排序 1、确定分界点:mid = (l + r) / 2 2、递归排序left, right 3、归并 合二为一 模板 注意l 和 1 的区分 #include<bits/stdc++.h> //万能头文件 using namespace std; const int N = 1000010;
阅读全文
摘要:浮点数二分 模板 假如求平方根 #include<bits/stdc++.h> //万能头文件 using namespace std; int main() { double x; cin>>x; double l = 0, r = max(1, x); while (r - l > 1e-8)
阅读全文
摘要:整数二分 二分的本质并不是单调性,有单调性一定可以二分,无单调性也可能可以二分。 模板代码如下: #include<bits/stdc++.h> //万能头文件 using namespace std; int check(int mid) { } //区间[l, r]被划分成[l, mid]和[m
阅读全文
摘要:#快速排序模板 快速排序算法的证明与边界分析 算法证明 算法证明使用算法导论里的循环不变式方法 快排模板(以j为分界) 快排属于分治算法,分治算法都有三步: 分成子问题 递归处理子问题 子问题合并 void quick_sort(int q[], int l, int r) { //递归的终止情况
阅读全文
摘要:###高精度算法 高精度加法: 题目描述 高精度加法,相当于a+b problem,不用考虑负数. 输入格式 分两行输入。a*,*b ≤10500 输出格式 输出只有一行,代表a+b的值 输入输出样例 输入 #1 1 1 输出 #1 2 输入 #2 1001 9099 输出 #2 10100 当拿到
阅读全文
摘要:自动状态机 图灵机大概就是一个“自动机”,就是说代码分好几种状态,每种状态做不同的事。 举个简单的例子吧 输入一个字符串,输入的只有两种字符,一种是字母,一种是空格。现在求一共有几个单词。注意,有可能有多个空格连在一起,开头和结尾都有可能有空格。 那么这是一道简单的有穷自动机,运行时分两种情况: ①
阅读全文
摘要:关于sscanf函数和sprintf函数的用法 sprintf sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串,除了前两个参数类型固定外,后面可以接任意多个参数。 1、sprintf 最常见的应用之一莫过于
阅读全文
摘要:字符串专题 朴素模式匹配算法 int Index (SSTring S, SString T) { int k = 1; int i = k; int j = 1; while (i <= S.length && j <= T.length) { if (S.ch[i] == T.ch[j]) {
阅读全文

浙公网安备 33010602011771号