![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 81
GoldenaArcher
Done is better than perfect
展开
-
Leetcode 刷题目录
Leetcode 刷题目录按照 Leetcode 题解 这份刷题目录解的题,如果有题目出现在 Leetcode 题解 以外,就是碰到过的题目。Github地址: Leetcode 刷题目录算法思想双指针167. 有序数组的 Two Sum633. 两数平方和345. 反转字符串中的元音字符680. 回文字符串88. 归并两个有序数组141. 判断链表是否存在环524. 最长子序列二分查找69. 求开方744. 大于给定元素的最小元素5原创 2022-05-24 14:18:08 · 412 阅读 · 1 评论 -
[LC 总结] 前缀和(Prefix Sum)总结& 10 道相关练习题
类型与题目列表如下:题目的解法都做过了,会留在最后一个部分,接下来就梳理一下 prefix sum,列举的题目从简单到 -> 困难。原创 2023-11-07 21:19:49 · 662 阅读 · 0 评论 -
[python 刷题] 437 Path Sum III
Path Sum III 的解法肯定就是 I & II 的进阶版,I & II 中求的是从 root -> leaf 的和,因此好算一些,只需要遍历到 leaf,然后算一下。因此解题思路也是一样的,同样都是使用 prefix sum + hash table 去解题,这里主要需要注意一点的是,不同分支上的 dict 不能串起来,如题目中的。就可以获取结果,不过 III 求的是任意一段和,问是不是能等同于。,虽然使用 JS 写的,不过 python 的实现也更新了一下。的话,就会发现这道题就非常的熟悉,原创 2023-11-07 01:15:13 · 194 阅读 · 0 评论 -
[python 刷题] 1248 Count Number of Nice Subarrays
题目如下:numskkReturnsub-arrays这道题和挺像的。原创 2023-11-05 10:54:41 · 189 阅读 · 0 评论 -
[python 刷题] 1343 Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold
题目如下:arrkandthreshold, returnkthreshold。原创 2023-11-05 03:02:22 · 108 阅读 · 0 评论 -
[python 刷题] 2866 Beautiful Towers II
这时候的山峰是没有前一座山峰高,因此对前一座山进行一下处理。这里处理方式比较粗暴,就是直接把前面的山给挖了,然后通过获取的下标,做一个反向延长,类似于。而另一个方面 ,这道题求的又是高度之和,所以又是一个 prefix sum 的变种问题,也因此解题需要将这一部分考虑在其中。这是一个极端案例,另一个极端案例就是 ⛰️ 的顶端在末尾,整个数组都是呈上升趋势。,解题思路也是类似的(都是 monotonic stack)新建一个 stack 存储遍历过值的下标,新建一个数组存储。从图像上来说,这道题其实有点像。原创 2023-11-03 21:46:44 · 209 阅读 · 0 评论 -
[python 刷题] 974 Subarray Sums Divisible by K
依旧是 prefix sum 的变种题,基础技巧,即使用 hashmap 去保存 prefix sum 的这个特性与。其利用的特性是当出现两个以上,余数为一样的子数组,自然代表着中间的前缀和为可被。,也就是数组的和本身就可以被 k 所整除的个数,最终就能够得到结果。的核心技巧一致,不过这里保存的并不是当前的前缀和,而是余数。可以看到,数组中余数为 4 出现了 4 次,其组合可以呗写为。4 -> -3 对应 [5, 0, -2, -3]5 -> -3 对应 [0, -2, -3]4 -> 5 对应 [5]原创 2023-10-29 11:38:30 · 563 阅读 · 0 评论 -
[python 刷题] 2874. Maximum Value of an Ordered Triplet II & 2909. Minimum Sum of Mountain Triplets II
这是最近几周周赛的一道题目……我发现最近周赛好像题目都跟 prefix sum 有关,过去一个月有三次第一二题都是这种。所以稍微整合一下两道都是 prefix sum 相关,并且解法都挺相似的题目这两道题,I 和 II 的解法一样,不过 I 可以用暴力解做,所以这里就不提了,直接看 prefix sum 的解法即可本质上来说,这道题的核心思路和。原创 2023-10-28 06:52:45 · 123 阅读 · 0 评论 -
[python 刷题] 287 Find the Duplicate Number
题目:numscontainingn + 1[1, n]inclusive.innums, returnwithoutnums。原创 2023-10-22 06:51:47 · 273 阅读 · 0 评论 -
[python 刷题] 19 Remove Nth Node From End of List
这道题本身的难度不是很大,最简单的方法就是 2-pass,第一个循环找到链表的长度,随后循环到。这个时候的 fast 指向 3,slow 则是指向新建的 head,这里的差是。反而是因为代码实现起来会方便一些,否则就要使用。这么处理一下,其实边界条件挺多的(主要是当。这也是一个可以用双指针解决的方法,题目中说。整体上来说,链表也好、二分搜索也好,这些。的边界条件其实就会影响代码会不会 AC。就是 2,也就是倒数第二个结点。,其实换个方式理解也可以理解成。这两个代码从结果上来说是一样的。原创 2023-10-19 11:18:34 · 725 阅读 · 0 评论 -
[python 刷题] 138 Copy List with Random Pointer
处理方式和 2-pass 实现差不多,我跑了一下,用 1-pass 并没有快很多,不过实现起来会稍微麻烦一些是真的。这道题目说起来很复杂,实际上还是挺简单的,主要就是说让创建一个深拷贝(也就是说二者内存地址并不想通的复制)。最简单的实现方法是跑两遍循环,第一个循环将所有的元素存到哈希表中,第二个循环则完成。除了深拷贝之外,这道题还有一个比较特殊的点,一般的单链表里每个结点只有。题目中并没有说过所有的元素都具有唯一性,因此也有可能存在两个结点的。,指向下一个结点的地址。的指针,指向链表中任一一个结点。原创 2023-10-18 21:19:14 · 140 阅读 · 0 评论 -
[python 刷题] 143 Reorder List
这道题虽然说不允许修改链表结点上的值,但是改了也能过……那样的解法就是将所有的值保存在一个数组里,然后遍历整个数组,通过判断数组当前所在的结点去修改值。正确的做法是找到链表的一半,翻转后半段,再一个个交替串联,所以这种情况下来说,这样也就意味着会产生环形链表,所以正确的做法是找到中点前的结点。指向空,这样就有了两个不相关的链表,也就不会出现环形链表的情况。, 所以这种是能过但是面试情况下是不行的情况 🙅。这道题唯一需要注意一点的地方在于寻找的中点。当然,因为这道题已经明确说了,。不允许修改链表结点上的值。原创 2023-10-17 12:55:13 · 236 阅读 · 0 评论 -
[python 刷题] 239 Sliding Window Maximum
这道题另一个比较巧妙的点在于,之前碰到的常规题中,直接保存的都是值,而这道题中保存的是下标,通过下标就能够准确的获得 queue 最左侧,也就是 queue 中的最大值应该在什么时候被移除。接下来遍历到 5,5 比起 queue 中任何一个数字都要大,也就是说对于一直到 5 还是合法区间的区域内,没有保存比 5 小的数字的意义。接下来又到 6,因为 6 比 queue 中所有的数字都要大,因此保留 queue 中的数字没有任何意义,此时 queue 中只有 6。,因此这道题的时间复杂度是可以控制在。原创 2023-10-13 03:21:09 · 112 阅读 · 0 评论 -
[python 刷题] 76 Minimum Window Substring
要求找到完全一致的配对,而这道题可以允许子字符串包含重复和多余的字符。,这里只需要做一个最简单的修改,就是完成对整个数组的循环,并且在满足。题目中要求的是长度最短的字符串,因此满足要求的就是。是在满足需求,即找到包含。以 LC 给的案例来说。原创 2023-10-09 11:50:42 · 92 阅读 · 0 评论 -
[python 刷题] 567 Permutation in String
挺像的,依旧使用 dict+sliding window 实现,不过与其对比使用传统的 dict,这里会用 Counter,方便解决默认值的问题。中不包含的字符,那么 Counter 就会重置,并且左侧的指针指向。中对应的数量大于左侧指针时,需要不断地将左侧指针向右移。中的,只是出现的频率可能会不一样而已。需要注意这里有一个特殊情况,就是。的情况,这时候就可以直接返回。中不包含这个字符,所以重制。中的内容一定是包含在。原创 2023-10-09 01:25:26 · 71 阅读 · 0 评论 -
[python 刷题] 424 Longest Repeating Character Replacement
这道题也是一个 sliding window 的题,需要被置换的字符串的计算方法为非最大频率的字符串,总字符串长度的计算方式是。的解法,但是那个解法不太好推导,而且从大 O 上来说没什么特别大的差别,所以就不会涉及到最优解,感兴趣的可以自己找一下解法。这时候最大频率的字符串依旧是 A,但是需要置换的。首先声明一下,这个解法不是最优解,时间复杂度为。当需要被置换的值 大于等于。这时候最大频率的字符串是 A,需要置换的。,同时,也要不断减少 dict 中的字频。,所以左侧的指针需要不断移动,一直到。原创 2023-10-08 11:59:07 · 88 阅读 · 0 评论 -
[python 刷题] 3 Longest Substring Without Repeating Characters
解题思路是用双指针+哈希表,左右指针指向子字符串的开始和结束的位置,哈希表存储每个字符串最后出现的下标+1,每次更新右侧指针时,如果当前字符是已经出现的字符,则将左指针移向最后出现的位置。这里存储的所有位置都是下标+1,主要是为了针对只出现 1 个字符的案例,如。,所以针对这个情况,所有存储的位置都是下标+1,计算字符串长度时也用。之前所在的下标位置,依旧会取到包含重复字符的字符串,因此需要取当前。开局的时候 dict 是空的,左右指针同时指向。这到提要求找的是最长的,没有重复符号的子字符串。原创 2023-10-08 01:10:54 · 282 阅读 · 0 评论 -
[python 刷题] 981 Time Based Key-Value Store
这个方法来说,保存进数组的格式就没有这么严格了,只要能够获取时间戳和值就行。题目中已经提到了会严格增长,也就是说不会重复,那么使用 dict 也可以,这里就使用另一个数组了。都是持续增长的,也就是排序的。一个已经排好序的数据结构+搜索的题型,不出意外的就会联想到 binary search。在开始实现设计题之前,首先要确认应该选择什么数据结构,而这一点题目中也有提示:根据 key 获得对应的数据。同时为了防止等同时间戳的数字不存在,当前值为最贴近时间戳的值,更新。也因此,初始化的数据结构可以定位。原创 2023-10-07 13:04:50 · 229 阅读 · 0 评论 -
[python 刷题] 4 Median of Two Sorted Arrays
题目:nums1andnums2of sizemandnOlogmn))这道题给了两个排序好的数组,然后求有序数组的中位数这题还是比较难的,我个人觉得直接跳到最优解理解起来会有点吃力,所以就循序从简到繁开始理解起来。原创 2023-10-07 04:23:19 · 280 阅读 · 0 评论 -
[python 刷题] 33 Search in Rotated Sorted Array
也因此需要判断 target 和 nums[l] 之间的关系,如果 target 比 nums[l] 小,那么 target 一定坐落于右侧的 cluster。每个情况又会延伸出两个需要解决的对应情况,因此总共需要手动处理 4 种对应的情况。这个情况比较简单,只要从右边的 cluster 中搜索即可。的关系即可,这里的情况稍微复杂一些。找出比图 1 中高亮的元素小的元素。找出比图 1 中高亮的元素大的元素。找出比图 2 中高亮的元素大的元素。找出比图 2 中高亮的元素小的元素。另,如果刚开始的判断不是做。原创 2023-10-05 10:56:02 · 93 阅读 · 0 评论 -
[python 刷题] 153 Find Minimum in Rotated Sorted Array
这个写法能过,并且我个人觉得虽然因为为了找最小数字手动 cover 了一些 edge cases 乱一些,不过理清思路什么的方便一些,个人留着用来推出干净写法。是一个比较好的二分算法指向,这道题也是一个二分算法的经典题。这里假设没有被操作过的数组是排好序,每次进行旋转,都会将。,让找到数组中最小的数字,也就是找到未被旋转的数组中的。,不用特别在意一些 edge case。也就是说该数组中存在两个递增数组。的第一个数字就是整个数组的最小值。的第最后一个数字大,而。来说,只要找到一个点。原创 2023-09-30 08:16:37 · 112 阅读 · 0 评论 -
[python 刷题] 875 Koko Eating Bananas
这样的 pattern,大概是能够比较模糊的猜测出,这道题是一道 binary search,这道题的要求就是在。也就是让 koko 从每小时 1 根香蕉开始吃起,一直吃到正好在 h 小时内可以吃完香蕉的速度就返回。这样一个有序数组内,找到一个特定的解,所以暴力解的空间复杂度为。因为使用了二分算法,这道题的时间复杂度为。,换言之,这道题可以理解成,在。在一个有序数组中找到一个特定的解。中找到一个最小的数字,使得。,所以香蕉的吃速上限为。原创 2023-09-29 21:08:34 · 149 阅读 · 0 评论 -
[python 刷题] 84 Largest Rectangle in Histogram
之后重复遍历,一直到完成数组遍历,不过此时 stack 中还是有多余的值的,这个情况下代表 stack 中的 histogram,其 x 轴可以一直延伸到最右端,因此可以用。的时候,再次遇到 y 轴不可眼神的情况,因此要进行连续退栈的操作,因为 stack 中倒数两个值都比当前遇到的 histogram 要大。当前情况下,蓝色方块 y 不受限制,x 是可以继续延伸的,此时可以将对应的 x 和 y 存到 stack 中,stack 中的值为。的方法获取其对应的 x,再乘以对应的 y,获得最终面积。原创 2023-09-26 13:11:23 · 113 阅读 · 0 评论 -
[python 刷题] 853 Car Fleet
这个时候,初始位置较大的那辆车相当于作为距离和速度的上限,两辆车相遇后即可合并为一个 cluster,并且依旧以初始位置较大且速度较慢的那辆车作为上限。周赛第三题解应该用 monotonic stack 做优化的,没写出来,所以多刷两题 monotonic stack 的题目找找感觉……主要原因也是因为在初始距离较大,初始速度较慢,在抵达最终距离前/时被追上,一定意味着后车抵达最终距离的耗时。如果车碰撞在一起的话,就会融合成一个 cluster,这题问的是到了终点后会有几个 cluster。原创 2023-09-25 10:45:16 · 97 阅读 · 0 评论 -
[python 刷题] 739 Daily Temperatures
这是一道 monotonic stack 的题,翻了一下之前关于 monotonic stack 的笔记,写的不是特别的好,当时看的时候觉得讲明白了,好久不刷题再复习的时候又觉得有点似懂非懂的,把 sack 翻完重新写一下……因为图标解释按天数算是 1-indexed based 的,数组时 0-indexed based,这里会有个误差,第六天对应的下标时 5。对于每一天的天气来说,找到下一个在 y 轴上比它高的数字即可,暴力解就是遍历所有的可能性,时间复杂度为。第四天的情况有些不一样,因为当天的。原创 2023-09-25 05:40:01 · 153 阅读 · 0 评论 -
[python 刷题] 22 Generate Parentheses
现在再提出一个更加优化的解,暴力解是提出了所有可能的解,并且再对其进行便利,不过在构建子节点的时候,其实是有先决条件可以对子节点进行限制的,以。,不过距离我上一次学习数学已经是五六年前的事情了,为避免误人子弟就不一步步推了。,其中生成所有节点的过程可以理解成一个二叉树的生成,因此遍历的时间复杂度为。的来源,基本上可以看到,所有的子树上选项被砍了一半。,具体导出这里就不细说了,我怕把自己也绕进去。指的就是合法的括号配对,这里会提两个解。,也是出于同样的理由,需要保存所有。解,因此时间复杂度为二者的乘积。原创 2023-09-24 21:32:05 · 109 阅读 · 0 评论 -
[python 刷题] 42 Trapping Rain Water
是一个 generator expression,会生成一个 generator object,也就是一个 iterable。我稍微去掉了几个半透明的方块,这样看起来稍微清楚一点,本质上来说它的面积还是受限于较短的哪根立柱,因此可以沿用。才好理解一些,毕竟两题的核心思路很像,都是获取容器中所能盛放的最大面积。而言,它的面积为:对它而言最高的立柱,再减去其本身的面积。会执行这个 iterable,并且返回相应的总和。这里需要找到的就是两条立柱之间的凹陷的面积,即。这个解法的时间复杂度和空间复杂度都为。原创 2023-09-23 01:29:48 · 114 阅读 · 0 评论 -
[python 刷题] 11 Container With Most Water
这道题也是一个比较经典的双指针+贪心,求的事总面积,题目中已经提出容器无法被倾倒 🫗,在不考虑三角的情况下,面积的构成就是 长(x 轴) x 宽(y 轴) 的组合,多提一句,只是针对这道题,greedy 一定能够导出有最优解,所以没有必要使用 DP,DP 因为要寻找全局最优解,所以时间复杂度为。,也就是说,高都不变,指针之间的距离越小,面积自然就越小。可以看到,容器的面积是收到长和高的限制,而高的选取则为。,只需保留最终结果和 2 个指针,时间复杂度为。这道题的空间复杂度为。原创 2023-09-22 05:15:31 · 135 阅读 · 0 评论 -
[python 刷题] 167 Two Sum II - Input Array Is Sorted & 15 3Sum
虽然 3 sum 出来的比较早,不过按照解法来说,2 sum II 算是 3 sum 的前置解法。原创 2023-09-22 01:26:59 · 146 阅读 · 0 评论 -
[python 刷题] 12 Integer to Roman & 13 Roman to Integer
python 刷题] 12 Integer to Roman & 13 Roman to Integer。原创 2023-09-21 08:04:18 · 54 阅读 · 0 评论 -
[python 刷题] 128 Longest Consecutive Sequence
这个情况下就比较清楚的可以看到哪个点在哪个 cluster 里,在实际的实现中,可以用一个 set 去存储所有出现的值,每次将值存入 cluster 中,都可以检查一下当前值是否是 cluster 的最小值,如果是的话,查看当前 cluster 的长度。Union Find 也可以用来解这题,它的时间复杂度是 amortized linear,不过这个问题的话有一个 linear 的解。最简单的方式其实还是排序,不过题目中要求时间复杂度为。,的检查,所以这个情况最坏只会跑一次,而。,而排序的时间复杂度为。原创 2023-09-21 01:52:27 · 330 阅读 · 0 评论 -
[python 刷题] 271 Encode and Decode Strings
这道题在求一个 generic 的解法,其中一个解决思路是使用当前字符串的长度加上一个特殊符号作为分隔符,并将其加到字符串前/后就可以解决这个问题。诚然求一个 generic 的情况,可能说会有同样的符号出现在字符串中,不过只要找第一个合法的分隔符即可,如这里使用 数字+简单的说,就是讲一个数组转化成字符串,再将字符串转换成数组,并且保证输入输出是一样的问题。,获取当前字符串的长度,截取字符串,并且将其推到 list 中,重复操作。整体流程就是,从左到右读取第一个数字(当前字符串的长度),一直到。原创 2023-09-20 10:07:50 · 99 阅读 · 0 评论 -
[python 刷题] 36 Valid Sudoku
这道题解数独,其实还是比较简单的,只是验证当前板子上有的数字能否构成一个合法的数独,而一个合法的数独就是每行、每列、每个。,所以不管怎么跑时间和空间复杂度都是。没有写完,因为最后的I写法更好一些。的盒子里都只能有不重复的。其实就是硬解,反正能写完就行。,按照这个逻辑硬写就行。原创 2023-09-20 08:20:29 · 76 阅读 · 0 评论 -
[python 刷题] 238 Product of Array Except Self & 2012. Sum of Beauty in the Array
这个写法将原本的 3 pass 缩减成了 2 pass,即只有两个循环,主要是因为没有保存 postfix 这个数组,而是一边迭代一边计算 postfix。同时,prefix 的值直接存在了返回值中,跳掉了表格中下标为 0 的占位符。其中 prefix 是所有的前置乘积,postfix 是所有的后置乘积。虽然时间和空间的大O还是一样的,不过速度和性能上确实好了不少。题目要求是获取除了自己以外的所有乘积,以题目中的案例。的时间复杂度,以及不能用除法。另外还有就是题目要求的。原创 2023-09-19 02:39:24 · 165 阅读 · 0 评论 -
[python 刷题] 347 Top K Frequent Elements
可以默认这题跟 dict/map/set 有关,这题的话依旧是用 dict 存储数字和出现的频率,随后根据 dict 中值进行排序,获取 top k 的数字。,下标(index) 对应数字出现的频率。这也就是为什么初始化的时候,freq 的大小为。会返回一个数组,不过在 dict 的情况下,返回的是 tuples 的数组,以。,iterable 比较简单,key 的话排序的依据,默认为。这个解法肯定是更优的,最差情况下二者的时间复杂度都为。在最差情况下,这个算法的时间复杂度为。,得出的结果也一样。原创 2023-09-18 07:05:55 · 100 阅读 · 0 评论 -
[python 刷题] 49 Group Anagrams
和 dict 主要的区别就在于,前者当遇到当前 dict 中不存在的 key,会使用提供的默认值,而 dict 就会直接报错。这个就不把遍历的 str 转换成 dict,而是直接通过排序的方式获得 Anagram,理论上来说这个写法的时间复杂度为。对于数量比较小——这里就 26 个字母——的 iterable 来说,tuple 一般来说会比 frozenset 快一些。的要慢一点,但是比我之前写的那个方法要快一点点,不过写法则是干净很多。第二个写法更妙一些,它最终的时间复杂度还是。所以,最终的答案就是。原创 2023-09-18 02:22:15 · 320 阅读 · 0 评论 -
[python 刷题] 242 Valid Anagram
的结果为 true 的情况 sorted(key, value) 结果完全一致,第一条回答找了一个 python 的源码实现,说内部进行递归调用判断 dict 中每个元素都是相通的,不过目前代码的 reference 消失了。然后进入两个循环,第一个循环创建一个 dict,进行字符和频率的 mapping,第二个循环检查当前字符是否出现在 dict 中,如果没有返回 false,如果有,那么出现的频率减少。总结就是,如果两个 dict 的 key 相同,每个 key 的 value 也相同,就可以用。原创 2023-09-17 10:29:06 · 268 阅读 · 0 评论 -
[python 刷题] 217 Contains Duplicate
一道非常简单的入门题,新建一个 set 去保存所有的值,如果有重复直接返回。原创 2023-09-16 02:08:44 · 121 阅读 · 0 评论 -
[JavaScript 刷题] 特殊数组的特征值, leetcode 1608
这道题在一个列表上看到的,刚开始用暴力解想过了就过了,不过后面看了一下关键字,发现解法……非常有趣。时间复杂度可以从On2降为Onlogn)),再降为On,顺便记一下学习过程,毕竟很少看到简单题这么复杂的。原创 2023-02-14 12:21:46 · 97 阅读 · 0 评论 -
LC 200, 721,684 并查集解法
使用的基础代码都是中放的,一点变动都没有,主要的变动就是放在调用函数里面操作了。唔,没啥讲解因为我觉得讲得差不多了,题目也没放,感兴趣的可以直接跟着题号找一下题目。原创 2022-11-06 09:59:35 · 154 阅读 · 0 评论