算法
记录刷算法的过程
诨号无敌鸭
纵有疾风起,人生不言弃
展开
-
蓝桥杯javaB组省赛基础知识冲刺
题主只是个想混省三的小菜鸡,而且时间不足,所以所写内容可能略有不完善之处,待题主后天考完,有时间时,或许再完善。原创 2024-04-11 20:04:41 · 292 阅读 · 2 评论 -
滑动窗口的最大值和最小值
2.题目链接:https://leetcode.cn/problems/sliding-window-maximum/description/2.任何时刻,L++(数从右侧进窗口),R++(数从左侧进窗口)还有个面值dp,学完动态规划再回来做。(暴力时间复杂度是O(N^3)1.滑动窗口的最大值和最小值。时间复杂度 O(N)原创 2024-01-30 12:47:29 · 165 阅读 · 0 评论 -
KMP算法
3.next数组前两个人为规定-1,0,后面的值是该下标之前的(不包括该下标)字符串前缀,后缀最长相等长度。2.比如aabaab的next[] = {-1,0,1,0,1,2}1.存放模式数组(短数组,123)的前缀,后缀最长相等长度。字符串匹配算法,解决abc123里面有没有123。前缀:一定包含第一个字符,一定不包含最后一个字符。后缀:一定包含最后一个字符,一定不包含第一个字符。(暴力时间复杂度是O(N * M))next[]数组是什么。时间复杂度 O(N)原创 2024-01-29 12:55:20 · 196 阅读 · 0 评论 -
贪心之区间分组
判断能否将其放入到某个现有的组中 l[i] > Max_r// l[i]是当前区间的左端点,Max_r是组的最右边的右端点。那为什么比最小值大的话就一定可以加入组呢,就是可以啊,一定可以加入最大右端点最小的那个组。题目描述:给出几个区间,要求给区间分组,每一组内区间不能重合,求分的的最小组数。因为新区间左端点如果比最小值还要小的话那肯定和其他的也重合了,就要开新组。问题:为什么每次和堆的头部,也就是所有组最大右端点的最小进行比较。a.如果不存在这样的组,则开新组,然后放入。2)从前往后处理每个区间。原创 2023-10-29 15:52:11 · 22 阅读 · 0 评论 -
Dp之最大不相交区间数量
今天没有讲解,hh应该是第一次在acwing没看题解的情况下achhhh。原创 2023-10-28 18:45:54 · 29 阅读 · 0 评论 -
贪心之区间选点
ans >= cnt //假设,区间从小到大排序为cnt个区间,两两之间不相交。所以覆盖每一个区间至少需要cnt个点。ans <= cnt // cnt是其中一种方案,而ans是最小数量的一种方案,故ans <= cnt。题目描述:给你一些区间,要求选点,使得每个区间内至少有一个点,求选择的点数量最少为多少。cnt:通过贪心选择点的数量,贪心算法求出的点。ans:答案,即区间选点的最小数量,最优解。若当前区间已经包含点,则直接pass。2)从前往后枚举每个区间。否则,选择当前区间右端点。原创 2023-10-27 19:21:06 · 21 阅读 · 0 评论 -
树形Dp之没有上司的舞会
需要召开舞会,每个人都不愿意与自己的直属上司一起参加,不然会减小快乐指数,现在要求所有人的快乐指数之和最大,求该最大值。我在想为什么会想到这样的状态表示,大概是都不想和直属上司在一起,所以上司是否选择会影响子节点的选择吧。f(u,0) = Σmax(f(si,0),f(si,1)) 上司不选,下属可选可不选。f[u][0] :所有以u为根的子树中选择,并且不选u这个点的方案。f[u][1] :所有以u为根的子树中选择,并且选择u这个点的方案。f(u,1) = Σf(si,0) 上司去舞会,下属一定不去。原创 2023-10-25 14:36:42 · 23 阅读 · 0 评论 -
线性Dp之编辑距离(2)
就是上一节的简单应用,可我这个小菜鸡还是没有想到用二维数组来解决。原创 2023-10-24 16:51:54 · 25 阅读 · 0 评论 -
线性Dp之最短编辑问题
对字符串A进行删除,插入,替换三种操作,使其变为字符串B,求最少操作次数。修改:f[i-1,j-1] + 0/1 (0是最后一个字符相同)分为最后一步对a数组进行删除还是增加还是修改操作。增加:f[i,j-1] + 1。f[i][j]:所有将a[1。删除:f[i-1][j]+1。原创 2023-10-23 20:48:10 · 20 阅读 · 0 评论 -
线性Dp之最长公共子序列问题
以情况二为例,a[i]不选,b[j]选,并不是f[i -1][j],f[i -1][j]含义是所有在第一个序列的前i-1个字母中出现且在第二个序列的前j个字母中出现的子序列,它包含情况二,但是因为求最大值,且f[i -1][j]又包含于f[i][j],因此即使重复也无所谓,故可以用f[i -1][j]的最大值来代替情况二的最大值,情况三同理。f[i-1][j-1] + 1 所有在第一个序列的前i-1个字母中出现且在第二个序列的前j-1个字母中出现的子序列 + 1(最后一个必有)原创 2023-10-22 12:03:39 · 23 阅读 · 1 评论 -
线性Dp之最长上升子序列
3)二分查找的前提是有序序列,故增加一个b数组,用来记录上升子序列,关键:动态更新b数组,注意b数组内存放的并不是最长上升子序列,但与最长上升子序列的长度一致。j]这个上升子序列的结尾元素更小,对于一个上升子序列,结尾元素越小,越有利于续接其他元素,也就越可能变得更长,即“潜力越大”b.小则替换:如果a[i] <= b[len]就用a[i]替换掉b数组中第一个大于等于a[i]的元素b[j]状态转移方程:0<=j<i-1 f[i] = max(f[i],f[j] + 1)4)考虑新进来一个元素a[i]原创 2023-10-21 16:36:01 · 22 阅读 · 1 评论 -
线性Dp之数字三角形
划分原则是 根据 从左下到i,j or 从右下到 i,j,而左下或者右下除最后一行外一定会有,故只需要从倒数第二行开始循环即可。划分原则是 根据 来自左上 or 来自右上 这样如果没有这个数,需要特判很麻烦。f [i] [j] : 从底向上走到(i,j)的路径距离。j:列(不过是斜着的列)原创 2023-10-19 19:06:30 · 33 阅读 · 1 评论 -
动态规划之分组背包问题
转移时,由上一层转移,则需由大到小枚举体积j。每一组物品有若干个,同一组物品只能选一个。由本层转移,则由小到大枚举体积j。对比完全背包,第i组物品选几个。标准:第i组物品选哪个。原创 2023-10-18 16:36:48 · 27 阅读 · 1 评论 -
动态规划之多重背包问题
二进制优化思维就是:现在给出一堆苹果和10个箱子,选出n个苹果。512分到10个箱子里每个箱子放2^k个苹果,那么由于任何一个数字x∈[0,1023]都可以从这10个箱子里的苹果数量表示出来,但是这样选择的次数就是 ≤10次。如果仍然不是很能理解的话,取这样一个例子:要求在一堆苹果选出n个苹果。我们传统的思维是一个一个地去选,选够n个苹果就停止。这样选择的次数就是n次。将s个物品打包成logs个新的物品组,用他们可以凑出从0~s的任意一个数,就不用一个一个凑了,时间复杂度:O(s)–>O(logs)原创 2023-10-17 17:22:21 · 25 阅读 · 0 评论 -
动态规划之完全背包问题
优化后i层只与i - 1层有关 时间复杂度O(n(m + 1))优化后的代码与01背包问题唯一的不同是j的遍历顺序是从小到大即可。f[i][j] 前i个物品,总体积<= j,存放的值为最大价值。3)k = 0时即为第一种情况,二者可合二为一。1)第i个物品选0个时,f[i -1][j]划分原则是按第i个物品选了多少个。每一件物品都可以无限使用。2)第i个物品选k个时。(具体证明在图片中)原创 2023-10-14 10:53:51 · 36 阅读 · 1 评论 -
动态规划之01背包问题
每件物品最多用一次。N件物品每件物品价值不一,容量为V的背包,每件物品只能用一次,求最大价值。原创 2023-10-13 22:11:24 · 23 阅读 · 0 评论 -
分解质因数
质因数 = 质数 + 因数。原创 2023-10-11 18:28:07 · 26 阅读 · 0 评论 -
试除法判断质数
在大于1的整数当中,除了1和它本身以外没有其他因数的数被称为质数(素数)原创 2023-10-10 18:46:17 · 25 阅读 · 1 评论 -
匈牙利算法求二分图的最大匹配(牛头人算法)
转载自匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。等等,看得头大?原创 2023-10-09 21:22:13 · 70 阅读 · 1 评论 -
染色法判定二分图
1)二分图就是可以把所有点划分到两个集合中,使得所有边都在集合外且在集合之间,集合内部没有边(图片来自于网络,侵删)2)小结论:图是二分图 图中不含奇数环(充分必要条件)原创 2023-10-08 17:47:01 · 21 阅读 · 1 评论 -
Prim算法求最小生成树问题
prim 算法干的事情是:给定一个无向图,在图中选择若干条边把图的所有节点连起来。要求边长之和最小。在图论中,叫做求最小生成树。prim 算法采用的是一种贪心的策略。每次将离连通部分的最近的点和点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小。原创 2023-10-02 11:56:26 · 45 阅读 · 1 评论 -
bellman-ford算法(解决有边数限制的最短路问题)
bellman-ford算法是求含负权图的单源最短路径的一种算法,算法效率较低,代码难度较低。原理:假设1号点到n号点是可达的,每一个点同时向指定方向出发,更新相邻的点的距离,通过n-1(就是边数)次循环操作,如果图中不存在负环,则一定到达n点,如果存在负环,n-1次松弛后一定还会更新。原创 2023-09-30 12:44:58 · 36 阅读 · 0 评论 -
DFS基础题--全排列问题
【代码】DFS基础题--全排列问题。原创 2023-09-21 10:52:27 · 36 阅读 · 0 评论