随笔分类 - 模板合集
摘要:class Solution: def countSpecialNumbers(self, n: int) -> int: s = str(n) ''' 返回从i开始填数字,i前面填的数字集合是mask,能构造出的特殊整数的个数 is_limit 表示前面填的数字是否是n对应位上的,及下一个填的数字
阅读全文
摘要:指针的本质是映射,使用一个地址保留我们想知道的东西。 滑动窗口是双指针思想的一种实现,使用l, r两个指针来维护一个数组的子序列。 滑动窗口问题可以分为两类,一类是固定大小的滑动窗口,一类是变长滑动窗口。 定长滑动窗口:求区间最大 不定长滑动窗口: 求最长,最短,子数组个数。 变长滑动窗口求最长最短
阅读全文
摘要:dfs 深度优先搜索:一条路走到黑 基本模型: Returntype dfs(参数) { 判断边界(返回) 扩展状态 dfs下一步 返回} dfs + 记忆返回值 = 记忆化搜索 class Solution { public: int minPathCost(vector<vector<int>>
阅读全文
摘要:tire树用来快速查找一组字符串。 算法流程 int son[N][26], cnt[N], idx; char str[N]; // 插入和删除类似,每次从根节点入场,采用计数方法,0表示没有此节点,1表示存在节点。 void insert(char* str) { int p = 0; for(
阅读全文
摘要:计数的思想,源自于计数排序。 计数就是把出现过的元素个数进行记录。在集合相关操作中,计数+1表示加入元素,计数-1表示删除元素。 我们在操作过程中,有时要对某些变量进行记录,记录出现的位置,记录上一次的值都是计数的思想。 本题我们采用计数的思想,记录每个字母出现的次数。s的长度为n。出现最多次字母的
阅读全文
摘要:归并算法: 递归+合并,在递归的途中进行分治。递归会把区间越分越小,此时就可以进行分治操作。 可以使用全局变量进行分治操作。 可以在函数中进行分治操作,在递归树中实现pushup和pushdown,记性父节点与子节点的关系计算。 class Solution { public: struct Nod
阅读全文
摘要:分块是一种暴力做法的优化。 基本思想是把要操作的对象分为根号n份,然后按份进行操作。 模板题: #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 1e5 + 10; struct Node
阅读全文
摘要:跳表RMQ算法 求解静态区间最值的一种算法。 f[i][j] 表示 从i出发,长度为2^j这一段区间的最大值。 初始化和递推: void init() { for(int j = 0; j < M; j ++ ) { for(int i = 1; i + (1 << j) - 1 <= n; i +
阅读全文
摘要:离散化算法常用来解决负值问题和取值范围过大问题。 模板: 使用lower_bound或者库函数set,map来写 写法1.lower_bound速度快 // 把要进行离散化的值排序去重后放入alls数组中,用二分进行映射。int find(int x) { return lower_bound(al
阅读全文
摘要:单调栈本质: 及时去掉无用数据, 保证栈中数据有序。 单调栈的思考方法,假设我们要找寻右侧第一个大于当前数字的数,就要将<=当前数的元素出栈。 当拿到一个问题时,要大的,剔除小的;要小的,剔除大的。 模板题: class Solution: def dailyTemperatures(self, t
阅读全文
摘要:算法原理: 将一个字符串看成是一个P 进制的数字。 代码模板: # python def __init__(self, s): n = len(s) self.BASE = BASE = 131 # 进制 131,131313 self.MOD = MOD = 10 ** 13 + 7 # 10**
阅读全文
摘要:二分算法模板 边界要求:二分答案时,我们最终的答案是由mid进行判定,然后通过移动l或r来缩小范围。当我们的数据中所有的数据都无法使l进行移动,l指向一个未定值(-1)表示l没有用到。所以,我们二分模板中的l, r分别指向L - 1, R + 1。 while(l + 1 < r) { int mi
阅读全文
摘要:#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1e6 + 10, M = 2010; int n, m; int a[N]; i
阅读全文
摘要:单调队列通常用来解决区间最值问题。 二维单调队列用来在矩阵中找子矩阵的最值,即求a * b大小的子矩阵中的最大值与最小值。 做法: 我们先预处理出每行滑动窗口长度为b的最值,并将其放到窗口最右侧位置;如0~b - 1窗口的最值放到 下标为b - 1 的位置。 处理完行后,我们对列进行处理,维护长度为
阅读全文
摘要:思想 a ~ b区间可以转换为 0 ~ b - 0 ~ (a - 1) 用这种前缀和的思想,可以快速枚举所有合格条件的自区间。 class Solution: def subarraySum(self, nums: List[int], k: int) -> int: m = dict() m[0]
阅读全文
摘要:反悔贪心,顾名思义,就是可以反悔的贪心算法。 反悔贪心有两种实现方式:一种是利用堆实现,成为反悔堆;另一种是通过差值构造来构造出反悔自动机,让任何一种贪心策略都可以得到最优解。 本题我们可以先对lastday进行排序,之后遍历列表若能加入堆,直接加入;若不能加入,则看一看堆顶元素和当前元素的关系,若
阅读全文
摘要:环图由一些简单的链和环组成。 对于有向图,所有点入度与出度 <= 2,就是一个环图 对于无向图,所有点的度数 <= 2,就是一个环图 环图中所有的链与环互不相交。 常见问题:环的大小,个数,路径 这种无序变有序的问题,建图方法:把起点向终点连一条边。每个点入度出度都是1,所以建成的图中只存在若干简单
阅读全文
摘要:原题链接:https://www.acwing.com/problem/content/851/ #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn = 510,IN
阅读全文