算法
文章平均质量分 77
Yake1965
我是一个老兵,87年接触苹果II机,286、386、486...一路过来,计算机日新月异,而我还是原来的我。一事无成,没有做过项目、没有参加过大赛,但育人无数。
展开
-
leetcode 估算题
TLE 在信息学竞赛及其训练中是 Time Limit Exceeded 的缩写,即时间超限,表示你提交的程序运行使用了超出题目限定的时间,故该数据点不得分,通常出现在信息学竞赛在线评测系统(Online Judge)的错误反馈,是信息学竞赛常用的术语之一。4、在OJ评测时加入了文件读写。由于无法读取到输入而时间超限。2、算法效率较低(时间复杂度过高)。原创 2024-03-08 15:56:00 · 218 阅读 · 0 评论 -
Gosper‘s Hack
例如 二进制数 110110,我们需要找到它从左往右的最后一个 01,然后把这个 01 变成 10,再把它右边的 1 全部集中到最右边(这里右边的 1 显然都是连续的,否则与最后一个 01 矛盾),即 110110→111001。上面的代码有很多无效枚举,即大小不等于 cols 的集合,每次也要枚举进来。Gosper’s Hack 算法,让每次枚举的二进制数 1 的个数恰好等于 cols。Gosper’s Hack 是生成 n 元集合中所有包含 k 个元素的子集的算法。原创 2023-11-02 09:14:17 · 375 阅读 · 0 评论 -
树上倍增法求最近公共祖先 LCA
倍增其实就是二分的逆向,二分是逐渐缩小范围,而倍增是成倍扩大。用于解决一些静态树的查询问题。原创 2024-01-06 14:05:14 · 438 阅读 · 0 评论 -
延迟更新 Delay updates
【代码】延迟更新 Delay updates。原创 2023-07-04 09:09:05 · 243 阅读 · 0 评论 -
面积最大的蛋糕
1465. 切割后面积最大的蛋糕2943. 最大化网格图中正方形空洞的面积100169. 移除栅栏得到的正方形田地的最大面积原创 2023-12-24 14:03:55 · 98 阅读 · 0 评论 -
快速幂 FastPower
的顺序,从 x 开始,每次直接把上一次的结果进行平方,计算 6 次就可以得到 x。的值,而不需要对 x 乘 63 次 x。「快速幂算法」的本质是。原创 2023-12-10 18:42:37 · 116 阅读 · 0 评论 -
素数筛 Prime sieve
素数筛 Prime sieve原创 2023-01-07 17:57:54 · 1001 阅读 · 0 评论 -
合并区间 Merge intervals
用一个哈希表/有序集合记录每个元素首次出现的位置和最后一次出现的位置,每个元素就对应着一个不可分割的区间。所以 [1,2,1,2][1,2,1,2] 这一段必须是完整的,不能分割。如果第二个区间和第一个区间没有交集,把合并后的区间个数 m 加一。如果第二个区间和第一个区间有交集,那么合并区间,维护合并后的区间的右端点 maxR。把该数组分到无法再分,得到 [3] + [1,2,1,2] + [4,4]再次遍历数组,那么第一个区间就是 [0, r[nums[0]]]。考虑每个 + 号选或不选,一共有 2。原创 2023-12-10 19:22:06 · 523 阅读 · 0 评论 -
优先队列 Priority Queue
动态求取最值问题,大量 leetcode 实践。原创 2021-12-14 21:40:26 · 4346 阅读 · 0 评论 -
偏序 Partial Order
则称 P 是 A 上的一个偏序关系,通常记作 ≼。注意这里的 ≼ 不必是指一般意义上的"小于或等于"。若 P 是 A 上的一个偏序关系,用 a ≼ b 来表示 (a, b) ∈ P。整除关系便是一个定义在自然数上的一个偏序关系 |,3 | 6 的含义是 3 整除 6。大于或等于也是定义在自然数集上的一个偏序关系。原创 2023-11-20 22:01:07 · 330 阅读 · 0 评论 -
拓扑排序 Topological sorting
拓扑排序 Topological sorting原创 2022-08-29 09:04:27 · 446 阅读 · 0 评论 -
欧拉图 Euler Graph
如果没有保证至少存在一种合理的路径,我们需要判别这张图是否是欧拉图或者半欧拉图,要求字典序最小,那么我们每次应该贪心地选择当前节点所连的节点中字典序最小的那一个,并将其入栈。为了保证我们能够快速找到当前节点所连的节点中字典序最小的那一个,我们可以使用优先队列存储当前节点所连到的点,每次我们 O(1) 地找到最小字典序的节点,并 O(logm) 地删除它。给定一个 n 个点 m 条边的图,要求从指定的顶点出发,经过所有的边恰好一次(可以理解为给定起点的「一笔画」问题),使得路径的字典序最小。原创 2023-10-21 14:07:54 · 279 阅读 · 0 评论 -
贪心 Greedy Algorithm
贪心(Greedy Algorithm)11. 盛最多水的容器44. 通配符匹配45. 跳跃游戏 II55. 跳跃游戏122. 买卖股票的最佳时机 II134. 加油站135. 分发糖果179. 最大数253. 会议室 II277. 搜寻名人280. 摆动排序316. 去除重复字母321. 拼接最大数330. 按要求补齐数组334. 递增的三元子序列358. K 距离间隔重排字符串376. 摆动序列397. 整数替换402. 移掉 K 位数字406. 根据身高重建队列409. 最长回文串410. 分割数组的原创 2022-04-02 14:42:38 · 3371 阅读 · 0 评论 -
八、区间 DP
375. 猜数字大小 II二分法只是一种可能,求最小值需要枚举猜的数来最终确定答案。方法一:递归猜的数字是 k,而答案不是 k 的话,问题变为求解 (1, k - 1) 和 (k + 1, n) 的子问题需要的代价的最大值。class Solution: def getMoneyAmount(self, n: int) -> int: @lru_cache(None) def dfs(x, y): return m原创 2021-11-12 08:25:24 · 547 阅读 · 0 评论 -
★ 两数之和
不能排序,因为找的是索引。a + b = target, 一但 a 确定 b 就确定了,即 a,b 之间存在恒等的关系。原创 2023-04-11 09:19:09 · 440 阅读 · 0 评论 -
十一、数据结构优化 DP
单调栈上二分, Java 官方推荐使用 Deque 来模拟栈,Deque 没法直接通过下标检索(来实现手写二分),引入 TreeMap 辅助。floorEntry 方法找到第一个小于或等于指定 key 的 Map.Entry。ceilingEntry 方法找到第一个大于或等于指定key的 Map.Entry。java 数组模拟单调栈。原创 2024-01-10 20:33:50 · 266 阅读 · 0 评论 -
单调栈 Monotone Stack
掌握单调栈的精髓,主要用于★Next Greater Number 问题的解决,优化和维护最值。原创 2022-02-04 10:36:17 · 1985 阅读 · 0 评论 -
矩阵对角线遍历
【代码】矩阵对角线遍历。原创 2023-12-31 09:29:39 · 777 阅读 · 0 评论 -
内向基环树
如果找到了一个之前访问过的点xx,且之前访问 x 的时间不早于 startTime,则说明找到了一个新的环,此时的环长就是前后两次访问 x 的时间差,即 clock−time[x]。基环树的关键就是找到环,可以先把环当作这个无根树的 “根” ,也就是把环当成一个点(先不管它),这样一颗基环树就变成了一个普通的树,然后先按照解决普通树的方法对“根”的所有子树依次处理求解答案,最后在单独对环上所有的点进行操作求解最终答案即可。对于不在基环上的点 x,其可以访问到的节点数,是基环的大小,再加上点 x 的深度。原创 2023-11-11 22:14:13 · 417 阅读 · 0 评论 -
六、划分型 DP
416.分割等和子集剑指OfferII101.分割等和子集473.火柴拼正方形698.划分为k个相等的子集1723.完成所有工作的最短时间2305.公平分发饼干1655.分配重复整数410.分割数组的最大值915.分割数组659.分割数组为连续子序列805.数组的均值分割2025.分割数组的最多方案数2270.分割数组的方案数.....................原创 2022-07-20 09:10:55 · 1674 阅读 · 0 评论 -
字典树 Trie
的每个节点只有两个孩子,那如果每个节点可以有多个孩子呢?这就形成了「多叉树的子节点数目一般不是固定的,所以会用变长数组来保存所有的子节点的指针。」是一种特殊的多叉树,它的 TrieNode 中 chidren 是一个大小为 26 的一维数组(当输入只有小写字符),分别对应了 26 个英文字符 ‘a’ ~ ‘z’,也就是说形成了一棵「26 叉树」。Trie(发音类似 “try”),又称前缀树或字典树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如。原创 2023-11-12 14:36:22 · 267 阅读 · 0 评论 -
2262. 字符串的总引力
据此,我们在从左往右遍历 s 的同时,对每个字母 s[i] 记录其上一次出现的下标 last[s[i]] 和上上一次出现的下标 prelast[s[i]]。记录字符 s[i] 上一次出现的位置为 pre(默认为 -1),加上 s[i] 之后,只会影响区间 (pre, i] 内所有以字符 s[i] 结尾的子串引力值,子串个数为 i - pre 即增加的引力值。特别地,如果 last[s[i] 或 prelast1[s[i]] 不存在,可以视作 −1,从而保证上式的正确性。原创 2023-10-29 14:11:08 · 295 阅读 · 0 评论 -
离散化 Discretization
*离散化有一个很重要的前提:**只关心数据之间的相对大小关系。离散化,把无限空间中有限的个体映射到有限的空间中去。离散化是在不改变数据相对大小的条件下,对离散的数据进行相应的范围缩小。离散化过程,将一组实数转换为一组整数,使得原始数据的顺序和区间关系得以保留。将原始数据排序,然后为每个不同的值分配一个整数。这个整数是该值在排序后出现的位置,即离散化后的数值。原创 2023-12-05 15:01:06 · 118 阅读 · 0 评论 -
二、网格图 DP
二维 DP原创 2023-07-16 11:08:07 · 203 阅读 · 0 评论 -
桶排序、计数排序、基数排序
桶排序、计数排序、基数排序原创 2021-11-24 16:14:10 · 2977 阅读 · 0 评论 -
消除类题目
【代码】消除类题目。原创 2024-01-22 09:29:50 · 68 阅读 · 0 评论 -
双指针 Double Pointer
88. 合并两个有序数组125. 验证回文串141. 环形链表167. 两数之和 II - 输入有序数组202. 快乐数283. 移动零27. 移除元素原创 2021-10-07 11:11:25 · 712 阅读 · 0 评论 -
贡献法 Contribution method
贡献法。原创 2023-07-02 11:16:34 · 384 阅读 · 0 评论 -
位运算 Bit Operation
位运算(Bit Operation)原创 2022-07-06 10:03:26 · 796 阅读 · 0 评论 -
24_02_18
【代码】23_10_22。原创 2023-10-22 18:24:40 · 158 阅读 · 0 评论 -
括号 系列
【代码】Leetcode 基础题。原创 2024-01-07 12:36:22 · 398 阅读 · 0 评论 -
Leetcode 超难题目 Hard
这道题很有可能是LC主站(LCP除外)新的天花板,之所以难度分没有超过1719题,是因为双周赛样本量本身不多,而这题有一定的“猜结论”。某个LC积分2900+的大佬认为,即使数据范围只有1000,这也是一道相当难的题目。因为记录dp[j]为最优时,nums[j]的最小值(注意nums[j]很可能是被改过的),这样的DP本身就很难想到。而同时保证dp[j]最大nums[j]最小是否就更利于后面的转移,这点非常难证明。这个题的数据范围并不是1000,因此需要单调数据结构优化来保证复杂度合理。原创 2024-01-05 19:28:17 · 1065 阅读 · 0 评论 -
【扩散】元素
【代码】【扩散】元素。原创 2024-01-30 09:24:58 · 74 阅读 · 0 评论 -
石子游戏 I - IX
数学n 堆石子,按下标偶奇性分成二组。Alice 可以决定 Bob 只能取石子数量小的一组。Alice 总是可以赢得比赛。先手的 Alice 可以自由选择取走一组或二组的一堆石子。如果 Alice 决定取 piles[0],则剩下的部分在开始处和结束处的石子堆都属于第二组,因此 Bob 只能取走第二组的一堆石子。如果 Alice 取 piles[n - 1],则剩下的部分在开始处和结束处的石子堆都属于第一组,因此 Bob 只能取走第一组的一堆石子。原创 2024-02-03 13:33:03 · 115 阅读 · 0 评论 -
跳跃游戏 I - VII
跳跃游戏原创 2022-09-18 11:28:48 · 843 阅读 · 1 评论 -
序列 DP
序列 DP原创 2022-11-28 12:54:17 · 670 阅读 · 0 评论 -
完美二叉树, 完全二叉树和完满二叉树
完美二叉树、完全二叉树和完满二叉树完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别。树(Tree)树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。树的基本术语Root 根,树的顶端结点Child 孩子,当远离根(Root)的时候,直接连接到另外一个结点的结点被称之为孩子(Child);Pare原创 2022-02-11 20:07:33 · 12384 阅读 · 0 评论 -
摩尔投票法
169. 多数元素方法一:哈希表class Solution: def majorityElement(self, nums: List[int]) -> int: counts = collections.Counter(nums) return max(counts.keys(), key=counts.get)方法二:排序class Solution: def majorityElement(self, nums: List[int])原创 2021-10-23 15:43:03 · 593 阅读 · 0 评论 -
53.最大子数组和
dp[i] 表示以 nums[i - 1] 结尾的子数组的最大和记忆化搜索premax/premin:前 i 个元素的子数组的和的最大/小值maxsum/minsum:数组中子数组和的最大/小值无环,即为 53. 最大子数组和有环,分首尾两段,要使两端之和最大,必须让中间的子数组和最小,即最大子数组和为:sum(nums) - minsum,问题转换为求最小子数组和。前缀和、单调队列,滑动窗口。原创 2023-07-20 19:02:26 · 121 阅读 · 0 评论 -
855. 考场就座
【代码】855. 考场就座。原创 2023-08-22 09:11:02 · 153 阅读 · 0 评论