![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法刷题记录
文章平均质量分 78
记录一些算法题单刷题记录
Wei *
这个作者很懒,什么都没留下…
展开
-
【力扣周赛】第 373 场周赛(交换得到字典序最小的数组 & ⭐分解质因子+前缀和+哈希表)
存下 s % k 的第一个出现的下标即可,每次检查相同 s % k 的上一个出现位置是否满足子数组大小至少为 2 的条件。要使得剩余数字之和能被 p 整除,就需要所有数字之和-删去的数字之和能被p整除,即两者%p的结果相等。如果a和b可以交换,b和c可以交换,那么a,b,c的顺序是任意的。跟上面的题类似,记录的 value 是字母和数字数量的差。为了求最短的子数组,每次存的 key 是最近的下标。记录的 value 是 1 和 0 的差的前缀和。排序之后,可能可以交换的都在一起了,更方便判断。原创 2023-12-25 00:00:00 · 1620 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.12.11-2023.12.17 (⭐二维前缀和+二维差分 & 珂朵莉树)
因为先处理了 stk2,可以确保在 stk1 的数据推入 stk2 之前,stk2 中原创 2023-12-18 13:22:00 · 1021 阅读 · 0 评论 -
【力扣周赛】第 372 场周赛( ⭐查询 离线做法)TODO
O1。原创 2023-12-11 00:00:00 · 974 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.11.27-2023.12.3
就是找到长度为 n - k ,和最小的窗口,答案是 sum - mn。用差分 表示 from 到 to 的范围内增加了多少人,然后再还原。用一个变量维护上界,用一个有序集合维护新加的可用小数据。当新添加数字时,如果更小,则更新 mn 变量。参考官方题解的思想 和 0x3f的代码写的。维护最小变量mn,哈希表记录已经去除的数字。添加时 也只能添加 当前没有的,也是小的。去除时 是 去除最小的。原创 2023-12-09 00:00:00 · 1694 阅读 · 0 评论 -
【力扣周赛】第 118 场双周赛(⭐单调队列优化DP)
On2On。原创 2023-12-02 00:00:00 · 801 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.11.20-2023.11.26 (二叉树中的伪回文路径)
因为假设不这样做而是删除完整的一组两个连续相同的数字,结果不会比删除nums[i+1]和nums[i+2]更好。如果a == d,此时abcd四个数字均相同,两种删法结果一样。每个字符可以作为唯一字符的范围是从 【前一个该字符出现的位置,后一个该字符出现的位置】。对于第二种方法,删除a和b,得到c,d。对于第一种方法,如果删除b,有两种情况:1.a == c,2.a!我们考虑连续的两组,a,b,c,d 四个数字。考虑更差的情况,需要同时删除c,得到a,d。因此删除b的方法更优,即需要删除就删除一个。原创 2023-12-02 00:00:00 · 976 阅读 · 0 评论 -
【算法】滑动窗口题单——5.多指针滑动窗口⭐
另外两个指针 j 和 k,对应第二个数组的结尾,分别是第二个数组右端点的可行范围两边。当第二个数组不够大时,右移 j;当第二个数组还可以更大且不超过第三个数组时,右移 k。一个保证窗口中有 minK 和 maxK,另一个保证窗口中没有更大或更小的数字了。枚举右端点r,分别对应两个左端点l1和l2,l1~l2-1就是可选范围。使用两个 TreeMap 分别维护两个窗口中的最大值和最小值。两个窗口分别保证窗口内不同元素的数量是 k 和 k - 1。枚举 i,0~i 作为第一个数组。类似两数之和的思想。原创 2023-12-04 00:00:00 · 1758 阅读 · 0 评论 -
【算法】滑动窗口题单——2.不定长滑动窗口(求最长/最大)
窗口内最多有 1 个0,用 id 记录上一个出现 0 的位置,当出现新的 0 时,将左端点设置为 l = id + 1。维护一个滑动窗口,枚举右端点,当窗口中T和F的较小数量大于k时,将左端点向右移。随着右端点的枚举,左端点也会随着窗口的扩大导致不合理,从而将左端点右移。维护各个字符的出现次数,当哈希表中字符种类大于 2 的时候将左端点右移。每个窗口都假设变成最大的那个数字,不能变的移出窗口。维护一个窗口中最多出现 k 个 0 的滑动窗口。维护一个窗口,窗口中是可以被采集的水果。最后使用滑动窗口计算。原创 2023-11-20 00:00:00 · 227 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.9.25-2023.10.1(⭐LFU缓存&Java数据流&花期内花的数量)
OlognO1。原创 2023-11-20 00:00:00 · 176 阅读 · 0 评论 -
【算法】前后缀分解题单⭐
O1。原创 2023-12-04 00:00:00 · 859 阅读 · 0 评论 -
【力扣周赛】第 117 场双周赛(⭐数学、容斥原理)
O1Ologn。原创 2023-12-04 00:00:00 · 916 阅读 · 0 评论 -
【力扣周赛】第 115 场双周赛(⭐优化背包DP)(TODO)
题目要求两个相邻位置的 group 不能相等,没有别的要求,那么只要 group 发生了变化就加入答案即可。用一个nums列表存储已经枚举过的数字,枚举到prev的时候取出放入ans就好了。相当于求 dp[l],…,dp[r] 之和,dp[i] 表示组成 i 的方案数。还可以倒序求 dp,这样最后列表就不用翻转了。题目有一丢丢难理解,要慢慢看。将相同数字分到同一组,完成。原创 2023-12-02 00:00:00 · 980 阅读 · 0 评论 -
【力扣周赛】第 369 场周赛(⭐记忆化搜索 & 树形DP)
dfs(i,j)表示前0~i个数字,且后面有j个不到k的数字,此时的最小花费。自底向上每个节点都只会枚举一遍,不需要 记忆数组了。写的有点丑陋,但好歹是过了。多的不说,排名挺吉利的。自己改成了下面这样子。原创 2023-12-02 00:00:00 · 859 阅读 · 0 评论 -
【算法】滑动窗口题单——1.定长滑动窗口⭐
O1。原创 2023-11-28 15:10:58 · 986 阅读 · 0 评论 -
【算法】单调栈题单(矩阵系列、字典序最小、贡献法)⭐
枚举的x作为最后一个数字,当找到上一个更大的数字时,考虑其之前出现的最小值是否小于当前值即可。预先处理出 nums2 数组中每个数字的下一个更大数字,存储在哈希表中。生成 ans 数组时,从哈希表中逐个取结果即可。存储列表后,再使用单调栈处理。原创 2023-12-04 00:00:00 · 921 阅读 · 0 评论 -
【算法】单调队列 滑动窗口最大值
使用两个单调队列分别维护窗口中的最大值和最小值,当最大值和最小值之间的差不符合条件时,将两个队列中靠左的位置移除直到满足条件。单调队列是递减的,这样队首的就i是窗口中的最大值。模板题,维护一个固定长度窗口内的最大值。原创 2023-12-04 00:00:00 · 905 阅读 · 0 评论 -
【算法】单调栈题单——字典序最小⭐(一种类型的模板题)
冷静分析,先去掉一个字符,该去掉哪一个?为了字典序越小,肯定要越往前的字符越小越好,那么就应该将最靠前的,且满足s[i]>s[i+1]的那个s[i]删掉即可。怎么模拟多次这个过程呢?由于最先被删掉的一定更靠前,所以可以使用单调栈从前到后维护保留下来的字符。可以直接使用StringBuilder作为栈。以及0可以不删,留着当前导零直接去除。跟之前题目的区别在于,最多删除k次。也可以使用栈,再转换成字符串。原创 2023-12-02 00:00:00 · 689 阅读 · 0 评论 -
【算法】单调栈题单——矩阵系列⭐
Om2∗n。原创 2023-12-04 00:00:00 · 1039 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.9.18-2023.9.24(⭐拓扑排序&⭐设计数据结构:LRU缓存实现 LinkedHashMap⭐)
如果此映射应该删除其最年长的条目,则返回true。在向映射中插入新条目后,put和putAll调用该方法。它为实现者提供了每次添加新条目时删除最老条目的机会。如果映射表示缓存,这很有用:它允许映射通过删除过时的条目来减少内存消耗。双向链表维护各个节点被使用的情况,头节点是最近被使用的,尾节点是最久未被使用的。哈希表维护key和节点之间的映射,帮助快速找到指定key的节点。最后的答案就是剩余的边数 * 2。先去掉所有没有金币的叶子节点。这题的重点在于操作三的实现。再去掉最外两层的节点。原创 2023-11-06 00:00:00 · 121 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)
贪心得想,任意两个长和宽都可以组合起来。那么最大面积就是由最大的长和宽组合起来的结果。数据范围很小,采用三层循环。会比下面的代码快一些。原创 2023-10-29 12:07:42 · 320 阅读 · 0 评论 -
【算法】滑动窗口题单——3.不定长滑动窗口(求最短/最小)⭐ 删除最短的子数组使剩余数组有序
定义好 l 和 r 的含义,分别是第一个非递减子数组的结束位置和第二个非递减子数组的开始位置,而不是中间被删除的子数组的两端。需要满足的条件是窗口外的各个元素的数量都原创 2023-10-28 00:00:00 · 187 阅读 · 1 评论 -
【算法】滑动窗口题单——4.不定长滑动窗口(求子数组个数)
枚举左端点,扩展右端点。枚举右端点,收缩左端点。原创 2023-10-28 00:00:00 · 159 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.10.16-2023.10.22(只出现一次的数字Ⅲ&⭐原地堆化)
O1O1。原创 2023-10-28 00:00:00 · 244 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.10.9-2023.10.15(贪心&⭐位运算的应用:只出现一次的数字)
TreeSet 是 Java 中的一个基于红黑树实现的有序集合类,它提供了一些用于查找元素的方法,包括 ceiling() 和 floor() 方法。这两个方法用于查找与指定元素最接近的元素,但有一些差异。指定元素 e 的最小元素,或者如果不存在这样的元素,则返回 null。指定元素 e 的最大元素,或者如果不存在这样的元素,则返回 null。这样当可以排水时,可以O(1)取出下一个最需要排水的湖泊。如果存在等于 e 的元素,它也会返回这个元素。如果存在等于 e 的元素,它也会返回这个元素。原创 2023-10-21 00:00:00 · 214 阅读 · 0 评论 -
【力扣周赛】第 367 场周赛(⭐二维数组当成一维数组,前后缀分解)
我们需要算出每个数左边所有数的乘积,以及右边所有数的乘积,这都可以用递推得到。双指针取符合条件的子字符串,最后取出最小的那个。最后一题想了还久还是没做出来。原创 2023-10-21 00:00:00 · 267 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.10.2-2023.10.8(股票系列 & ⭐数据结构)
两个优先队列分别按价格升序和降序排列。当取出队首的价格和哈希表中存储的冲突时,不采用,而是继续取下一个元素直到不冲突为止。在更新每个时间戳的价格之前,先使用其之前的价格更新有序集合即可。让 buy[i] 从 sell[i-2] 转移过来就好了。有序集合存储目前已经出现过的价格及其对应的出现次数。单调栈中的每个元素是{日期,当日价格}。哈希表存储每个时间戳对应的价格。哈希表存储每个时间戳对应的价格。原创 2023-10-16 00:00:00 · 65 阅读 · 0 评论 -
【力扣周赛】第 364 场周赛⭐(前后缀分解+单调栈&DFS技巧)
周赛题目本质上是求一种类似于「非质数-质数-非质数」的路径个数。贪心:最后一位保留一个 1,其余的 1 都放置在最开始的位置。建树的过程中,对于每个节点只保留与它相连的最大的那三条边即可。计算每一个位置作为最高点时的最大结果,对所有结果取最大。建树之后,枚举每条边作为中间边的情况,更新最大值。这两题的共同点在于「枚举中间」,请读者细细品味。很差劲,脑子是糊掉的。原创 2023-10-01 00:00:00 · 235 阅读 · 0 评论 -
【力扣周赛】第 363 场周赛(完全平方数和质因数分解)
计算方式同质因数分解,把 n 的所有出现次数为奇数的质因子相乘,即为 core(n)。// 两两之间相乘之后是完全平方数,则质因数分解结果满足各个质因数数量奇偶性相同i原创 2023-09-17 13:55:13 · 322 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.9.11-2023.9.17(⭐反悔贪心&拓扑排序&Floyd)
从国王位置开始,枚举8个方向,走8步,如果遇到的位置存在于皇后集合中,则将其加入答案。在拓扑排序过程中多加一层循环,用来处理各个节点之间是否为先决条件。要么偷当前位置,要么不偷当前位置,取两者最大的。按照题意模拟即可,注意向下取整的用法。将所有皇后放入一个哈希集合中。按题意模拟八个方向即可。两种写法见仁见智吧。原创 2023-09-17 00:56:36 · 278 阅读 · 0 评论 -
【力扣周赛】第 113 场双周赛(贪心&异或性质&换根DP)
根据异或的性质,有 x ^ (i ^ x) = i, y ^ ((k - i) & y) = k - i,因此与 坐标 (x, y) 可以匹配的坐标是 (i ^ x, (k - i) ^ y),其中 i 的取值范围是 0 ~ k。对于一个新的 x 和 y,他要和另外的坐标匹配之和为 k,最多有 k 中可能,即 —— 0 + k, 1 + (k - 1),2 + (k - 2),…所以在 2 和 3 匹配之后,当枚举到 5 时,可以使用 5 替换掉 3,重新将 3 放入待匹配队列中。第二次 dfs 求答案。原创 2023-09-17 00:46:05 · 256 阅读 · 0 评论 -
【力扣周赛】第 362 场周赛(⭐差分&匹配&状态压缩DP&矩阵快速幂优化DP&KMP)
斜着走,一步顶两步——相当于可以同时横着走和竖着走。那么只要满足垂直和水平方向中最长的那个距离就好了。排序之后按顺序枚举,每次比较和上个区间结束位置之间的关系。注意有个特例是:只走一步时,如果起点和终点相同就不可以了。原创 2023-09-16 13:27:30 · 540 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.9.4-2023.9.10(⭐二叉树的重建&二分答案&拓扑排序)
根据数据范围,ranks 中至多有 100 个不同的数字,我们可以统计 ranks 中每个数字的出现次数,这样每次二分至多循环 100 次。重建的时候通过 split 将各个节点变成 列表或者数组的形式存储下来,同样按照前序遍历或者后序遍历重建二叉树即可。解码——使用split将列表转成字符串数组,将字符串数组解析到栈中,使用栈重建后序遍历二叉树。编码——将二叉搜索树的后序遍历结果保存在列表中,将列表转成字符串。能力值相同的人,在 t 分钟内修好的车的个数是一样的。总结一下这种题目的套路——原创 2023-09-10 22:00:04 · 348 阅读 · 0 评论 -
【算法题】小红书2023秋招提前批算法真题解析
定义 dp 数组 [n][2] 表示 以 a[i] 为结尾且选 a[i] 的子数组的最大和是多少,第二维的 0 和 1 分别表示当前有没有将元素换成 x 的操作。二分查找是为了快速找出以某一个精华区为起点时,最后一个被覆盖到的精华区的索引。前缀和是为了快速求出一个区间中的精华区一共有多少个精华帖子。记得要转 long 否则答案会溢出 int。按照题目要求读取数据,存入哈希表做计数统计。将结果放入列表,自定义筛选和排序即可。—— 最后的数组是这样的。使用等差数列求和公式得答案为。每次询问就是一批输入数据。原创 2023-09-08 22:23:26 · 877 阅读 · 0 评论 -
【力扣周赛】第 357 场周赛(⭐反悔贪心)
核心的思想是:x + y^2,枚举 y^2的值,并使得 x 在该枚举值下的值最大,就得到了该枚举值下的最大值。比较得到的所有的最大值就是最终结果了。如果有答案存在,就将已经枚举到的负值放入堆中,每次 s原创 2023-09-05 21:20:26 · 416 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.8.28-2023.9.3(到家的最少跳跃次数)
通过枚举购买钢笔的数量,计算此时可以购买铅笔的数量,+1即是购买此时数量钢笔时,购买铅笔的方案数。如果不相交,判断新加入的区间是否在当前区间之前,如果是,就先加入答案。遍历一遍之后,如果没有处理过新加入的区间,就说明新区间应该加在最后。将元素排序之后,从小到大依次处理各个数值作为根节点时的二叉树数量。当前区间与要加入的新区间之间的关系只有两种可能:相交或者不相交。一次遍历,遍历的过程中记录上一个 1 或 -1 出现的位置即可。的下标范围内找到最优解,其中 f 是最远进制点的坐标。如果相交,将两者结合即可。原创 2023-09-05 20:33:02 · 504 阅读 · 0 评论 -
【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 & 树上倍增、LCA⭐)
对于当前的前缀和 sum[r],前面有若干个满足 (sum[r] - sum[x]) % modulo == k 的下标,这些下标的共同特征是:它们的值 sum[x] = (sum[r] - k + modulo) % modulo。求 a 和 b 路径之间的所有边权,都变成相等需要操作几步——实际上是求 a 和 b 之间有几条边,其中出现次数最多的边权出现了几次。在枚举的过程中用哈希表 cnt 记录下满组 sum[i] = y 的 i 的数量,就可以快速找到 r 之前有几个可以和当前下标配对的下标 l。原创 2023-09-04 22:02:40 · 507 阅读 · 0 评论 -
【力扣周赛】第 112 场双周赛(统计一个字符串的 k 子序列美丽值最大的数目(贪心+计数+组合数学)
比如从 0,1,1,1,2,3 中取 k 为 4,那么 3 和 2 是一定要被选择的,然后在 3 个 1 中任意选择 2 个 1 即可。答案为 3 * 2 * 1 * C(3,2) = 18。只要两个字符串的奇偶位的各个字符的数量相等,就一定可以通过交换位置换成相同的字符串。如果若干个字符的出现次数一样,那么就把答案乘上对应的组合数。滑动窗口,维护窗口内的总和以及独特元素数量。贪心地选取出现次数最多的字符。原创 2023-09-04 00:00:00 · 165 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.8.21-2023.8.27(统计点对的数目)
也就是每次记录一下 start,继续用 while 枚举 i。原创 2023-09-04 00:00:00 · 258 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.8.14-2023.8.20(⭐切披萨&&3n块披萨)
定义 dfs(c, i, j) 表示把左上角在 (i, j),右下角在 (m - 1, n - 1) 的子矩阵切 c 刀,每块都至少包含一个苹果的方案数。dp[i][j] 表示考虑 0 ~ i 下标的 slices,购买 j 个最大价值。为方便取模运算,循环中的下标可以从 0 开始,在返回时再加一。有点像 环形打家劫舍 + 最多买卖k次的股票 的结合。原创 2023-09-04 03:00:00 · 311 阅读 · 0 评论 -
【LeetCode每日一题合集】2023.8.7-2023.8.13(动态规划&分治)
On3On2。原创 2023-09-04 03:00:00 · 309 阅读 · 0 评论