算法
文章平均质量分 84
Wei *
这个作者很懒,什么都没留下…
展开
-
【算法套路】(数组中)等价转换⭐
核心在于「个数」,能得到一个和个数有关的数学式子,就可以转换成 1(或者 -1),毕竟在讨论个数的时候,每个元素的贡献就是 1 了。前缀和设置为 字母与数字数量之差,相同前缀和的一对可以组成一个子字符串。注意,每个数字各不相同,整个数组中只有一个 k。本质上是「中心前后缀 + 哈希表计数」跟上面那道题几乎一模一样。原创 2023-12-04 00:00:00 · 406 阅读 · 0 评论 -
【算法】树形DP③ 监控二叉树 ⭐(二叉树染色&二叉树灯饰)!
其中靠儿子的转移:子节点不可能靠爹,且至少有一个靠自己。先去掉这个“至少有一个靠自己”的限制条件,那么 ch 的计算就和 fa 的计算一样了。除此之外,我们要记录 res[0] - res[2] 的最小值,这样最后将其和 0 取最大值,就可以达到将至少一个靠儿子的节点修改成靠自己的节点了。从下到上dfs,标记各个节点的节点。状态分为:该节点上有,该节点父节点上有,该节点子节点上有。将节点分成三类:1.靠自己 2.靠父节点 3.靠子节点。,其中dp[i]表示到该节点连续有i个时的最大价值。原创 2023-11-20 00:00:00 · 220 阅读 · 0 评论 -
【算法】单调栈 每日温度 接雨水
用单调栈计算出 l[] 和 r[],这两个数组分别表示 i 左右两边第一个比 height[i] 更小的数。注意这里对数组 l[] 和 r[] 做了初始化,所以能避免下面描述的错误。(即最后结果是正确的)先将链表转换成列表,再使用单调栈处理。就是找每个位置的上一个更大的位置。原创 2023-11-06 00:00:00 · 103 阅读 · 0 评论 -
【算法】矩阵快速幂优化动态规划
/ 0空,1上,2下,3满i < n;++i) {原创 2023-09-17 20:24:26 · 499 阅读 · 0 评论 -
【算法】二分答案
对于 nums[1],当其 < nums[0] 时,答案还是 nums[0];当其 > nums[0] 时,则答案是两者的平均向上取整。答案不好直接求,但是可以判断某个数字是否可以满足题目要求且单调时。」就要想到二分答案,这是一个固定的套路。首先最大值的最小值是 nums[0]。具体看下面例题体会一下即可。里面有一些二分答案的题目。原创 2023-09-17 20:20:50 · 229 阅读 · 0 评论 -
【算法】反悔贪心
i < k 时直接加入,如果有重复的类别就将当前元素放入栈中(因为是从大到小枚举,所以栈顶一定是利润最小的)用堆维护目前可以加的油,每次路过一个加油站先不加而是放入优先队列中,等到走不动了再一个个从大到小加油。如果不可以,每次遇到负数先放入优先队列中去,当血量不够时,再依次从小到大取出堆中的负数调换到队尾。当 i > k 时,如果当前元素还没有出现过,就可以尝试替换掉重复类型中利润最小的元素。每次将空格记录在优先队列中,当木板数量不够时,从小到大取出优先队列中的空格依次填上。按照加油站的出现顺序排序。原创 2023-09-11 23:05:37 · 2348 阅读 · 1 评论 -
【算法】树上倍增 & LCA
由于不知道 lca 的具体位置,因此从大到小枚举 i,尝试是否可以向上跳,直到 pa[x][i] == pa[y][i],循环结束之后,有 lca = pa[x][0]。当 x 和 y 在同一深度之后,如果 x = y,那么 x 就是 lca,否则 把 x 和 y 一起往上跳。先将 x 和 y 放在同一个深度上,即先让 y 跳 depth[y] - depth[x]。把相关链接放在最前面是因为,周赛遇到了几次,不会做。这才想起来学一下这个算法。两个节点 x 和 y,原创 2023-09-04 22:25:46 · 489 阅读 · 0 评论 -
【算法提高:动态规划】1.6 区间DP
根据笔者的经验,区间DP一般使用记忆化搜索会更好写一些。原创 2023-08-02 17:22:24 · 310 阅读 · 0 评论 -
【算法提高:动态规划】1.5 状态压缩DP TODO
先预先处理出,所有在一行中没有冲突的列集合然后对计算出对所有合理列集合 来说 没有冲突的列集合最后 枚举行、当前行的列状态、上一行的列状态,计算状态转移。原创 2023-08-02 13:55:24 · 367 阅读 · 0 评论 -
【算法提高:动态规划】1.4 状态机模型 TODO
限制 buy[i] 只能从 sell[i - 2] 转移过来就好了。dp 数组多开一维表示第几笔交易就好了。对当前的房间选择 抢 或者 不抢。|T| + 1 个状态自动机。就是 打家劫舍 那道题。原创 2023-08-01 22:10:01 · 245 阅读 · 0 评论 -
【算法提高:动态规划】1.3 背包模型 TODO
多重背包问题——物品的个数是多个,不是无限个。当作01背包来理解,s个物品当成s次01背包操作——通过二进制来优化。当作完全背包来理解,就是有数量限制的完全背包——这个数量限制就可以理解成滑动窗口的宽度,通过单调队列来优化。原创 2023-08-01 21:51:34 · 755 阅读 · 0 评论 -
【算法提高:动态规划】1.2 最长上升子序列模型(TODO最长公共上升子序列)
所以向上走的状态只能从向上走的状态转移过来;向下走的状态既能从向上走的状态转移过来,也可以从向下走的状态转移过来。跟最长上升子序列长度的方法差不多,只修改了递推公式部分,将 + 1 修改成了 + a[i]。对于问题2,当一个新的导弹来临时,我们首先检查是否有已经存在的系统可以拦截它。A:因为 bfs 需要的空间太大,可能会爆炸。计算每个节点作为结尾位置时向左和向右的递减子序列的最长长度即可。:从上面的贪心可以推出来,是在求最长上升子序列。按照一岸排序,求另一岸此时的最长递增子序列。最长公共上升子序列长度。原创 2023-07-26 21:17:47 · 519 阅读 · 0 评论 -
【算法提高:动态规划】1.1 数字三角形模型
第一想法是贪心的,先走一遍 dp,再走一遍 dp。让两个路径同时移动,无非就是 4 种情况,就对应着 4 种状态转移。k 表示走了几步,i1 和 i2 是两个路径到达的横坐标。状态要么从左转移过来,要么从上转移过来。其实就是说商人必须往右走或者往下走。dp 数组和原始数据数组可以复用。这道题和上一道题其实是一样的。不要被题目的商人必须在。个单位时间穿越出去。原创 2023-07-30 00:00:00 · 213 阅读 · 0 评论 -
【算法基础:动态规划】5.4 状态压缩DP
注意这道题不能预先处理出所有的 st 数组,因为在 m 和 n 不一样时, st 数组中的值也会变得不一样。:为什么要先枚举每个可以到达的状态集合 j,然后枚举该集合中可以到达的所有点 i,而不可以将枚举顺序反过来?表示 第 i 列中,有 j 集合的行伸出来了,即 i - 1 列的这一行放了横着的小方格。当横向方格摆放完成后,纵向方格的拜访方式就已经确定了。先枚举集合,再枚举到达该集合的最后一个点,再枚举可以转移到该点该集合的状态。例如这里有 5 行,j 的范围就是 0 ~ 1原创 2023-07-30 00:00:00 · 157 阅读 · 0 评论 -
【算法基础:贪心】6. 贪心
使用优先队列来维护所有组的结束端点位置,这样就可以快速找到当前结束位置最靠前的组。每次贪心地找出符合左端点原创 2023-07-30 00:00:00 · 316 阅读 · 0 评论 -
【算法基础:动态规划】5.4 数位统计DP(计数问题)(数位DP)
求 1 ~ n 中数字 x 出现的次数。是思路中最重要的部分。我们需要实现一个函数。原创 2023-07-30 00:00:00 · 344 阅读 · 0 评论 -
【算法基础:动态规划】5.3 计数类DP(整数拆分、分拆数)
容量是 n,物品的大小和价值是 1 ~ n 中的所有数字。从最小值 > 1 的转移过来,就是把每个数字都 + 1。从最小值 = 1 的转移过来,就是补上数字1。表示总和为i,总个数为j的方案数。原创 2023-07-30 00:00:00 · 218 阅读 · 0 评论 -
【算法基础:动态规划】5.2 线性DP
如果想不清楚的话,可以不要节省空间,就写个完整的 n * n 大小的 dp 数组就好。不要被吓到,算一下时间复杂度:1000 * 1000 * 10 * 10 = 10^8。每个数字可以从它上面的左右两边选择一个大的转移过来。所以就是上一题编辑距离的简单应用。三种编辑方式,对应着从。原创 2023-07-30 00:00:00 · 194 阅读 · 0 评论 -
【算法基础:动态规划】5.1 背包问题
是: 将每个物品的数量 x 分成若干组,每组的数量都是 2 的幂次。(因为分成这样若干个组之后,它们之间可以组合成 0 ~ s 的任意数量。将 1023 数量分组打包成 1,2,4,8,…那不能正好分成 2 的幂该怎么办呢?每一组 —— 背包容量 —— 每一组中的物品。这一题和上一题唯一不同的就是数据范围。把 多重背包拆分成 01背包即可。最后还剩多少,就设置成多少。原创 2023-07-30 00:00:00 · 268 阅读 · 0 评论 -
【算法基础:数学知识】4.4 快速幂
那么什么是线性同余方程?就是希望找到一个数 x,使得 a / b 的结果与 a * x mod m 之后结果相同。原创 2023-07-23 00:00:00 · 307 阅读 · 0 评论 -
【算法基础:数学知识】4.3 欧拉函数
即1 ~ n 中和 n 互质的数字个数。怎么判断两个数是互质的?A:两个数的最大公约数为1。(比如 1 和 1 就是互质的)原创 2023-07-23 00:00:00 · 142 阅读 · 0 评论 -
【算法基础:数学知识】4.2 约数
约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。原创 2023-07-23 00:00:00 · 117 阅读 · 0 评论 -
【算法基础:数学知识】4.1 质数
每次循环 j 是为了筛掉所有已经发现的质数的 i 倍,即 prime[j] 的意义是目前已经发现的第 j 个质数。A:因为当枚举到 i 时,就意味着已经把从 2 ~ i - 1 的所有质因子都除干净了。也就是说一个数 > 1,而且它的因数只有 1 和 它本身,那么它就是质数。从小到大进行枚举,每次枚举到一个质数,就把数据范围内它的所有倍数都删掉。(素因数或质因子)在数论里是指能整除给定正整数的质数。:不需要枚举所有的质数,只要枚举所有的数即可。的质因子,最后剩下的就是大于。从小到大枚举所有数,(原创 2023-07-23 00:00:00 · 168 阅读 · 0 评论 -
【算法基础:搜索与图论】3.6 二分图(染色法判定二分图&匈牙利算法)(TODO)
二分图是图论中的一个概念,它的所有节点可以被分为两个独立的集合,每个边的两个端点分别来自这两个不同的集合。换句话说,二分图中不存在连接同一集合内两个节点的边。原创 2023-07-23 00:00:00 · 1040 阅读 · 0 评论 -
【算法基础:搜索与图论】3.5 求最小生成树算法(Prim&Kruskal)
最小生成树有关树的定义生成子图:生成子图是从原图中选取部分节点以及这些节点之间的边所组成的图。生成子图中的所有节点和边都必须在原图中存在。生成树:一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择 n - 1 条,将所有顶点连通。我们定义无向连通图的最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树。只有连通图才有生成树,而对于非连通图,只存在生成森林。原创 2023-07-23 00:00:00 · 958 阅读 · 0 评论 -
【算法基础:搜索与图论】3.4 求最短路算法(Dijkstra&bellman-ford&spfa&Floyd)
比如上图,在第一次循环中 2 的 dis 被更新成了 1,如果不使用备份的话,那么 3 的 dis 会被接着更新为 2,但这并不是我们所期望的, 3 的 dis 被更新成 2 应该是在第 2 次循环时才会发生的事情。取出一个节点后,枚举它影响的所有其它节点即可,如果其它节点被影响了,就表示可以把这个被影响的节点放入队列中,(不过放进队列之前要先判断一下是否已经在队列中了,防止重复更新)。用 t 更新其它点的距离,因为有 m 条边,所以这个操作是 m 次,每次的时间复杂度是 logn,因此一共是。原创 2023-07-23 00:00:00 · 1085 阅读 · 0 评论 -
【算法基础:搜索与图论】3.3 拓扑排序
本文主要学习拓扑排序相关知识。拓扑排序的英文名是 Topological sorting。拓扑排序要解决的问题是给一个有向无环图的所有节点排序。我们可以拿大学每学期排课的例子来描述这个过程,比如学习大学课程中有:程序设计,算法语言,高等数学,离散数学,编译技术,普通物理,数据结构,数据库系统等。按照例子中的排课,当我们想要学习 数据结构 的时候,就必须先学会 离散数学 和 编译技术。当然还有一个更加前的课程 算法语言。原创 2023-07-20 18:37:34 · 683 阅读 · 0 评论 -
【算法基础:搜索与图论】3.2 树与图的dfs和bfs
要学会建树、建图的通用方法。dfs 和 bfs 的代码框架。原创 2023-07-20 14:49:52 · 324 阅读 · 0 评论 -
【算法基础】3.1 DFS和BFS
算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。BFS 全称是 Breadth First Search,中文名是宽度优先搜索,也叫广度优先搜索。每次找到 x 的位置,然后让它尝试向 4 个方向移动,直到找到最终状态。在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。这样做的结果是,BFS 算法找到的路径是从起点开始的。原创 2023-07-20 13:56:41 · 217 阅读 · 0 评论 -
【算法基础:数据结构】2.4 堆 和 哈希表(堆排序&模拟堆、散列表)
一般情况下(99.9%的情况下)可以假定不会发生冲突。,所以相乘之后再减去就相当于去掉了 从 0 ~ r 中的 0 ~ l 这一段。只需要开一个一维数组,不需要再开链表。但是 Java 的 API 可以实现,有 remove() 方法。在 6,3,4 里找到最小值 3,将 3 和 6 交换位置。在 6,3,5 里找到最小值 3,将 3 和 6 交换位置。中枚举当前插槽上的链表中的所有元素,看是否有元素 x。对于哈希表数组的每个位置,使用数组模拟了一个单链表。下面的写法相当于,用数组模拟哈希表。原创 2023-07-19 23:33:25 · 468 阅读 · 0 评论 -
【算法】摩尔投票法 找 多数元素
https://leetcode.cn/problems/majority-element/维护一个众数 ans 和它出现的次数 cnt。初始时 ans 为任意值,cnt 为 0。枚举数组中的每个数:如果当前 cnt = 0,先将当前数字设置成 ans。随后判断当前数字 x 与众数 ans 之间的关系,如果相等—— cnt++ ;否则 cnt–;其它解法其余解法可见:https://leetcode.cn/problems/majority-element/solutions/146074/du原创 2023-07-19 23:14:42 · 226 阅读 · 0 评论 -
【算法基础:数据结构】2.3 并查集
对于每一句话中的 x 和 y,先检查它们是否在一个集合里,如果在同一个集合里,那么就可以判断这句话是否是假话。否则,先将一个点的根节点维护的数量加到另一个点的根节点维护的数量,然后再合并这两个点。A:p[x] = y,即 把一棵树的根节点当成另一个树根节点的儿子。:将这棵树中的所有节点都当成另一棵树根节点的子节点——优化之后几乎就是。每个节点存储 它的父节点是谁。同一个集合表示:这一个集合内的所有动物之间的关系都可以确定。如果是真话—— 将它们所在的两个集合合并。每个集合的编号 是 树根的编号。原创 2023-07-19 17:41:22 · 1000 阅读 · 0 评论 -
【算法基础:数据结构】2.2 字典树/前缀树 Trie
可以发现,这棵字典树用边来代表字母,而从根结点到树上某一结点的路径就代表了一个字符串。异或运算:相同得 0 ,不同得 1。用于高效地存储和查找字符串集合的数据结构——检查到有反的,就可以 += 1原创 2023-07-18 20:00:39 · 995 阅读 · 0 评论 -
【算法】换根DP
834. 树中距离之和。原创 2023-07-17 00:18:40 · 889 阅读 · 0 评论 -
【算法基础】2.1栈和队列(单调栈和单调队列)
当枚举到一个元素时,从栈顶开始检查,如果栈顶的元素比当前元素小,那就找到了当前元素左边第一个更小的元素;和单调栈类似,每次枚举到一个新的元素时,将该元素一直与队列中的最后一个元素相比较,保持队列的单调性。为了求每个数字左边第一个比它小的数字,需要使用一个单调栈。单调队列常常用来维护一个窗口中当前的最大值或者最小值。如果栈顶的元素 >= 当前的元素,那么就将其弹出栈。如果栈是空的,说明左侧没有比当前元素更小的元素了。每个窗口的最大值和最小值就是队列队首的元素。这个单调栈从栈底到栈顶是单调递减的。原创 2023-07-15 00:00:00 · 314 阅读 · 0 评论 -
从集合论到位运算——常见位运算技巧及相关习题 & 状态压缩DP
本文的内容主要是 马住 一些 关于 位运算的操作。以及下面的练习题比较有质量。原创 2023-07-13 19:08:04 · 739 阅读 · 0 评论 -
【算法】数位DP
(因为 true 就表示前面选择的数字的各位和 n 的各位是一样的。dp[i][j] 表示枚举到第 i 位,前面匹配成功了evil 中的 j + 1 个字符(即 j 是 evil 的下标)。由于 mask 中记录了数字,可以通过判断 mask 是否为 0 来判断前面是否填了数字,所以 isNum 可以省略。这里由于 num1 是个字符串,所以直接计算原创 2023-07-11 14:05:36 · 771 阅读 · 0 评论 -
【算法】区间合并类题目总结
本文内容包括 重叠区间、不重叠区间、合并区间 的 左边界排序、右边界排序 方法。原创 2023-07-06 16:55:00 · 608 阅读 · 0 评论 -
【算法】从记忆化搜索到递推——动态规划入门
本文的题目其实都比较简单,但是为了学习记忆化搜索,还是要用记忆化搜索再做一遍,不要眼高手低。由于 dp 数组的无后效性,因此还可以将 dp 数组优化成两个变量。将大问题分解成子问题,即 dfs (i) 可以分解成 dfs (i - 1)对于简单的 dp 题,直接写 dp 还更简单一些,硬写记忆化搜索还有点难。因为——有些动态规划直接去想递推公式太难了,所以可以先写成记忆化搜索。由于记忆化搜索是从将大问题分解成子问题的角度去考虑的,所以会简单一些。如果读者觉得本文的题目太简单了,可以去尝试一下。原创 2023-07-04 20:39:33 · 733 阅读 · 0 评论 -
【算法】树形DP ② 打家劫舍Ⅲ(树上最大独立集)
在 bfs 的过程中,如果当前节点的概率为 p,他有 k 个子节点,那么它的所有子节点的概率就是 p / k,即在分母上乘了 k。从题意来看,每次青蛙都会往下走一层,很像层序遍历,所以可以是用 bfs 来模拟整个过程。第二个 dfs 用于枚举 alice 到达各个叶子节点的路径,在达到叶子节点时更新答案。在 bob dfs 的过程中,不是经过的所有节点都需要被设置时间的,而是。如果当前节点没有子节点,那么它的概率不变,再重新加入队列中。每个节点只会有一个父节点,因此它的子节点数量就是。,不需要单独计算了。原创 2023-07-04 13:29:02 · 304 阅读 · 0 评论