手撕算法
文章平均质量分 83
一根老麻花
这个作者很懒,什么都没留下…
展开
-
数论 | 质数
【代码】数论 | 质数。原创 2024-01-24 22:38:20 · 895 阅读 · 0 评论 -
KMP 算法
next 数组的求法是通过模板串自己与自己进行匹配操作得出来的。这样可以避免重复比较已经匹配的部分,提高效率。字符串的第一个匹配项的下标(下标从 0 开始)。这个子串的最长相同前后缀的长度。的某个字符不匹配,那么我们可以将。原创 2024-01-21 00:20:46 · 371 阅读 · 0 评论 -
岛屿问题(下)
为了方便实现并查集,将二维坐标转换为一维上的点,计算公式为。(代表土地) 构成的组合,这里的「相邻」要求两个。如果没有岛屿,则返回面积为。由一组上、下、左、右四个方向相连的。最后,对所有连通块大小取最大值。中最大的岛屿面积是多少?岛屿的面积是岛上值为。原创 2024-01-20 01:18:55 · 866 阅读 · 0 评论 -
岛屿问题(上)
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100。计算这个岛屿的周长。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。(水)组成的的二维网格,请你计算网格中岛屿的数量。此外,你可以假设该网格的四条边均被水包围。中,每块子岛屿的模块是否都属于。中该岛屿的每一个格子都被。中的同一个连通分量。原创 2024-01-18 23:18:55 · 406 阅读 · 0 评论 -
计算几何 | 凸包 | Andrew 算法
下一个点若在栈顶边的左侧,则弹出栈顶的边;若下一个点在栈顶边的右侧,则保留栈顶的边,将新的边压入栈中;若下一个点在栈顶边的延长线上,按照题意,弹出栈顶的边,将新的边压入栈中。最后记得将两个边界点更新一下栈。原创 2024-01-14 23:53:12 · 418 阅读 · 0 评论 -
最小生成树 | Prim 算法
每次将离连通部分的最近的点和点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小。原创 2024-01-13 23:20:08 · 405 阅读 · 0 评论 -
基本数据结构 | 并查集
合并两个集合查询某个元素的祖宗节点OlognO(logn)OlognOlognO(logn)Ologn,代码比较复杂,一般不单独用两种优化结合起来用,时间复杂度可以压缩到OαnOαn))原创 2024-01-12 17:41:18 · 383 阅读 · 0 评论 -
动态规划 | 最长公共子序列问题
给定两个字符串 和 ,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。这里假设和的下标均从 1 开始状态定义:表示和的最长公共子序列的长度状态划分:根据和是否在最长公共子序列中,可以将状态划分为四类由于情况 4 包含在情况 2 和情况 3 中,因此不需要要单独考虑,最终可以原创 2024-01-01 23:03:46 · 1023 阅读 · 0 评论 -
动态规划 | 鸡蛋问题 | 元旦假期来点“蛋”题
给你 2 枚相同 的鸡蛋,和一栋从第 层到第 层共有 层楼的建筑。已知存在楼层 ,满足 ,任何从 高于 的楼层落下的鸡蛋都 会碎 ,从 楼层或比它低 的楼层落下的鸡蛋都 不会碎 。每次操作,你可以取一枚 没有碎 的鸡蛋并把它从任一楼层 扔下(满足 )。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请你计算并返回要确定 确切的值 的 最小操作次数 是多少?状态定义:表示总共有 i 层楼,现在手上有 j + 1 个鸡蛋。状态计算:我们假原创 2023-12-30 21:38:17 · 458 阅读 · 0 评论 -
最短路问题 | 单源最短路 | 条条大路通罗马,有人生来在罗马
简单最短路径问题:如果 i 到 j 的最短路经过 w,那么从 i 到 j 的最短距离一定为从 i 到 w 的最短距离加上从 w 到 j 的最短距离。表示节点 i 到起点的最短距离。初始置,。集合 s 用于存储当前已确定最短距离的点。从1到 n 开始遍历(代表加入 s 的结点个数),找不在 s 中距离最短的点 t,更新最短距离,然后吧节点 t 加入集合 s 中。堆优化版Bellman - ford算法特点如果有负权边的话,最短路不一定存在状态定义:表示经过 k 条边(该变量是隐含的),从原创 2023-12-29 17:25:51 · 844 阅读 · 0 评论 -
快速排序回顾及相关题型
这里先假设数组下标从 1 开始,后续程序实现时可以通过 k - 1 来对齐下标从 0 开始的数组。设计一个算法,找出数组中最小的k个数。:递归调用左右两个区间,对左右两个区间进行快速排序。将所有的数按照此法分成左右两个区间。:对于快速排序,合并操作无需单独进行。,证明比较繁琐,可以参考《算法导论》请注意,你需要找的是数组排序后的第。,证明比较繁琐,可以参考《算法导论》个最大的元素,而不是第。:合并操作无需单独进行。:合并操作无需单独进行。的右边,并得到基准元素。的右边,并得到基准元素。原创 2023-12-27 15:05:24 · 939 阅读 · 3 评论 -
递推与递归
当最后一层的操作进行完毕,前面层数的灯一定处于全亮状态,只需关注最后一层是否全亮。若最后一层没有全亮,则说明,对于该第一层的开关操作,最终无法得出所有灯全亮的操作。对于这道题,比较容易想到的是利用 BFS,从目标状态(所有灯都亮)开始,搜索经过 6 步“拉灯”所能到达的所有状态,判断初始状态是否包括在内。一共输出 n 行数据,每行有一个小于等于 66 的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。对于每一种的第一层开关操作,我们都可以通过上述方式,判断最终是否能得到灯全亮的状态。原创 2023-12-26 21:20:42 · 956 阅读 · 0 评论 -
动态规划系列 | 最长上升子序列模型(下)| 拦截导弹一网打尽!
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。对于这道题,没有很好的解法,只能通过暴力搜索,即考虑每个数是放在上升子序列或者下降子序列中,然后搜索全局最小值。例如,一套系统先后拦截了高度为 3 和高度为 4 的两发导弹,那么接下来该系统就只能拦截高度大于 4 的导弹。搜索过程中,可以判断当前子序列的个数是否超过了当前的最优解,若超过则进行剪枝操作,减小搜索空间。原创 2023-12-25 16:25:25 · 944 阅读 · 0 评论 -
动态规划系列 | 最长上升子序列模型(上)
五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。你的任务是,已知所有 N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。以南岸的城市为基准,我们可以发现,对于任意一种建桥的可行方案,北岸的城市位置都是严格单调递增的。,K,他们的身高分别为。原创 2023-12-24 22:16:09 · 1011 阅读 · 0 评论 -
动态规划 | 乘积最大
今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 90 周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ 也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:设有一个长度为 NNN 的数字串,要求选手使用 KKK 个乘号将它分成 K+1K+1K+1 个部分,找出一种分法,使得这 K+1K+1K+1 个部分的乘积能够为最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:有一个数字串:31231原创 2023-12-24 00:47:36 · 1019 阅读 · 0 评论 -
动态规划 | 数字三角形模型 | 类似题型一网打尽
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。原创 2023-12-22 21:16:44 · 868 阅读 · 0 评论 -
图论 | 网络流的基本概念
只需要再证明最大流大于等于最小割,就可以推出最大流等于最小割。是最大流,而它的残留网络存在增广路,则有。将 EK 算法中的 BFS 换成 SPFA。残留网络定义:一个可行流流网络。不是最大流,与原假设矛盾。最小割一定某个割,即。原创 2023-12-21 21:31:01 · 2632 阅读 · 0 评论 -
动态规划系列 | 一文搞定区间DP
因为只有这样,通过吸盘(吸盘是 Mars 人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。前面我们已经考虑了线性区间的石子合并问题,仔细观察环形区间的石子合并问题,可以发现将两个石子合并,可以看作在两个石子之间连一条边。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。原创 2023-12-20 19:22:36 · 1038 阅读 · 0 评论 -
分治算法 | 归并专题
合并过程:每次取左右区间当前最小的数进行比较,较小的数加入临时数组中。猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM 老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。由于需要按照原数组的顺序,返回每个元素右侧小于该元素的数量,因此可以用一个。的元素的数量,其实就是计算与。原创 2023-12-18 17:29:58 · 839 阅读 · 0 评论 -
纯爱至死不渝 | 双向奔赴的 BFS 算法 — 双向广搜
双向广搜是一种优化的 BFS 算法,它同时从起始节点和目标节点开始搜索,当两个搜索方向相遇时,就找到了一条最短路径。传统的 BFS 算法是从起始节点开始,逐层地访问图中的所有节点,直到到达目标节点。与传统的 BFS 相比,双向广搜可以减少搜索空间的大小,因此比传统的 BFS 搜索速度更快。同时,双向广搜可以减少搜索队列的长度,因此与传统的 BFS 相比,更不容易爆内存。,其中 b 是每个节点的平均分支因子,d 是目标节点的深度。,则输出最少的变换步数;及一组字串变换的规则(至多。,表示一条变换规则。原创 2023-12-15 22:19:07 · 1012 阅读 · 0 评论 -
动态规划系列 | 状态机模型(下)| IndeedTokyo2019校招笔试题
你现在需要设计一个密码 S,S 需要满足:例如:abc 和 abcde 是 abcde 的子串,abd 不是 abcde 的子串。请问共有多少种不同的密码满足要求?由于答案会非常大,请输出答案模 109+710^9+7109+7 的余数。第一行输入整数 N,表示密码的长度。第二行输入字符串 T,T 中只包含小写字母。输出一个正整数,表示总方案数模 109+710^9+7109+7 后的结果。1≤N≤501≤N≤501≤N≤501≤∣T∣≤N1≤|T|≤N1≤∣T∣≤N,∣T∣|T|∣T∣ 是 T 的长度原创 2023-11-30 20:04:37 · 1143 阅读 · 0 评论 -
动态规划系列 | 状态机模型(上)| 练完这些就算入门了!
用状态机模型求解动态规划问题,就是将原始问题用状态机模型进行表示,即每个节点表示状态,每条边表示一个状态转移,边上的权值表示转移的代价或收益。状态机模型的目标是找到一条从初始状态出发,经过若干次状态转移,达到某个终止状态的路径,使得最终的结果值最大或最小。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况原创 2023-11-29 21:28:04 · 1251 阅读 · 0 评论 -
CSES-1638 Grid Paths
观察状态转移方程,可以发现第 i 行第 j 列的格子只取决于第 i-1 行第 j 列的格子和第 i 行第 j-1 列的格子,因此我们可以将二维的。您的任务是计算从左上角方块到右下方块的路径数。您只能向右或向下移动。考虑一个n × n方格可能有陷阱的网格。不允许移动到有陷阱的方格。表示第 i-1 行的 j 到 n-1 的格子。表示第 i 行的 0 到 j-1 的格子,原创 2023-11-17 23:46:59 · 100 阅读 · 0 评论 -
动态规划 | 选出的数总和最大
给定一个正整数数组,现要从中选出一些数,满足数组中任意相邻的 3 个数最多有一个可被选中(即对任意𝑖,, , 三个数最多可被选中一个)。 请设计一算法使得选出的数总和最大。由于数组中任意相邻的 3 个数中最多有 1 个可被选中。因此,每个被选中的数之间至少要间隔两个数。每一个数都有选和不选两种状态。若当前数不选,可以从上一个数状态的最大值转移过来;若选择当前数,则只能从上一个空两个数的状态最大值转移过来。状态定义:表示第 i 个数处于状态 j 的最大和。表示第 i 个数不选,表示第 i 个数要选。状态转移原创 2023-11-13 20:18:14 · 109 阅读 · 5 评论 -
贪心证明 | 最少圆覆盖问题
假设存在一个最优解 A,其中第一个基站的位置不是贪心算法选择的位置,即不是能覆盖第一艘船的最右边的位置。那么,我们可以将这个基站的位置向右移动,直到它到达能覆盖第一艘船的最右边的位置,这样不会减少它能覆盖的船的数量。因此,这样得到的解 B 也是一个最优解,且它的第一个基站的位置是贪心算法选择的位置。设 A 是包括基站 1 的最优解,则 A’ 是除去基站 1 覆盖的船,剩余所有船构成的子问题 P‘ 的最优解,基站数。A’ 中的基站能够覆盖所有的船,只需要证明 A‘ 的基站数是最少的。,与 A 是最优解矛盾。原创 2023-11-11 22:42:13 · 193 阅读 · 0 评论 -
求 n + 2 个数的平均数
以及两个正整数 𝑥 和 𝑦,请设计算法求这 𝑛 + 2 数的中位数。这里的中位数定义为 𝑛 + 2 为奇数时,中位数为最中间大小的那个数, 𝑛 + 2 为偶数时,中位数为最中间大小的两个数的均值,并分析算法的时间代价。可以先分别查找原始数组中,不小于 x、不小于 y 的数的下标,分别记为 px 和 py。两个正整数,可以将较小的数记为 x,较大的数记为 y,方便后续的处理。给定一个按非递减排序的正整数数组。时间开销主要在两次二分查找,为。原创 2023-11-07 22:14:29 · 107 阅读 · 3 评论 -
随机漫步的傻瓜?买卖股票的最佳时机
给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次,卖k次。原创 2023-11-05 17:22:01 · 73 阅读 · 0 评论 -
树上着色问题 | 这个世界不能非黑即白,但树可以!
对一棵树进行着色,每个结点可着黑色或白色,相邻结点不能着相同黑色,但可着相同白色。请设计一种算法对树中尽量多的节点着黑色。原创 2023-11-04 18:07:00 · 284 阅读 · 0 评论 -
你以为穿了马甲我就不认识你了?最小化所有子序列中最大值的和
给定一长度为 N 的整数序列 (a1, a2, …, aN) ,将其划分成多个子序列(此问题中子序列是连续的一段整数),满足每个子序列中整数的和不大于一个数 B。设计一种划分方法,最小化所有子序列中最大值的和。原创 2023-11-03 16:24:53 · 138 阅读 · 0 评论