- 博客(934)
- 收藏
- 关注

原创 刷题小白入门攻略
明明自觉学会了不少知识,可真正开始做题时,却还是出现了“一支笔,一双手,一道力扣(Leetcode)做一宿”的窘境?你是否也有过这样的经历,题型不算很难,看题解也能弄明白,可一到自己做就变成了与题面面相觑无从下手。这种困境如今正烦恼着你还是已经被你克服呢?
2023-07-20 08:39:09
812

原创 写于LeetCode刷完900题之际的感想
时光匆匆,距离开始写博客转瞬便是大半年已过, 从最初寒假每天十题的刷题狂热信徒,到如今一周也做不到二十题的佛系上岸选手,有了很多感想经验,因而有了这篇文章。我的第一轮刷题,始于二叉树,接着按照二叉搜索树, 哈希表,栈, 堆,优先级队列,贪心, 数组,链表, 二分查找, 字符串, DFS, 回溯, BFS, 字典树, 并查集,动态规划这样的顺序, 在同一个Tag内按由易到难的顺序做题(ha...
2019-11-01 08:35:52
7676
10

原创 Python爬虫抓取LeetCode题解,获取力扣中国(leetcode-cn.com)提交代码,自动保存submission到本地,同步上传到github
力扣中国虽然可以和github绑定账号,但是我提交的题解并不能同步到github上……辛辛苦苦三个月,勤勤恳恳四百题,leetcode一片绿,github万里白。手动上传是不可能手动上传的,这辈子也懒得手动上传。找了一圈只能找到 Leetcode 的提交爬虫,没有力扣中国的,所以只能自己造轮子了。学了两天爬虫鼓捣了这么个东西出来,我用的蛮顺手的,希望你们也能用的顺手。项目地址:...
2019-05-24 19:13:40
5402
34

原创 LeetCode数据规模跟算法时间复杂度的对应关系
大致对应关系如下: Input Size Complexity 50000 O(n) 20000 O(n logn) 1000 O(n ^ 2) 30 O(n ^ 4) 20 O(2 ^ n)
2019-05-10 16:43:32
3844

原创 LeetCode 700题 题解答案集合 Python
2019.5.12更新至题号796,目前共有265题。2019.5.26更新至题号72, 目前共有347题。2019.6.16更新至题号70,目前共有382题。2019.7.7更新至题号5120,目前共有442题。2019.8.5更新至题号1147,目前共有502题。2019.9.6更新至题号288, 目前共有551题。2019.11.13更新至题号426,目前共有602题...
2019-03-27 21:24:58
109471
12
原创 LeetCode-Python0-443. 压缩字符串(字符串)
空间复杂度:O(logN),因为输入最长为 2000,那么最多有连续2000个相同的数字,在用 str() 进行转化为字符串的时候会产生 4 位 的额外空间,即2000跟 10 的对数。返回 6 ,输入数组的前 6 个字符应该是:["a","2","b","2","c","3"]"aa" 被 "a2" 替代。"bb" 被 "b2" 替代。然后根据这个相同字符串的长度,如果大于 1,就要写入数字,如果是1,只放字符就够了。返回 4 ,输入数组的前 4 个字符应该是:["a","b","1","2"]。
2024-11-11 03:26:40
315
原创 LeetCode-Python-381. O(1) 时间插入、删除和获取随机元素 - 允许重复
对于这道题,getRandom() 的思路和 380 相同,都是利用 random.choice(list),来随机返回 list 里的值,而且恰恰好 val 的出现频率正好就是权重,正合我们的需要。跟380不同的是,这道题要求每个值可以出现多次,而且输出随机元素的时候,要根据元素出现的次数充当权重来输出:比如一个数 A 出现了10次,另一个数 B 出现了 1 次,那么理论上 A 出现的概率就应该是 B 的 10 倍。// 返回 true,因为集合包含 1。// 1/3 的概率返回 2。
2024-11-03 08:33:40
730
原创 LeetCode-Python-380. O(1) 时间插入、删除和获取随机元素(集合)
首先 getRandom() 需要 O(1),我们就可以很自然地想到 random.choice(list) 可以帮助我们随机选择一个数组里的元素,其等价于 index = random.randint(0, len(list) - 1), return list[index],确实是O(1)的时间复杂度。// 由于 2 是集合中唯一的数字,getRandom 总是返回 2。// 向集合中插入 1。// 返回 false ,表示集合中不存在 2。// 2 已在集合中,所以返回 false。
2024-11-03 08:05:53
573
原创 LeetCode-Python-3076. 数组中的最短非公共子字符串(哈希表 + Trie Tree)
给你一个数组arr,数组中有n个非空字符串。请你求出一个长度为n的字符串数组answer,满足:answer[i]是arr[i]最短的子字符串,且它不是arr中其他任何字符串的子字符串。如果有多个这样的子字符串存在,answer[i]应该是它们中字典序最小的一个。如果不存在这样的子字符串,answer[i]为空字符串。请你返回数组answer。
2024-10-14 14:12:12
483
原创 LeetCode-Python-1870. 准时到达的列车最小时速
由于是在整数时间到达,可以立即换乘在第 2 小时发车的列车。- 由于不是在整数时间到达,故需要等待至第 1 小时才能搭乘列车。第 2 趟列车运行需要 3/3 = 1 小时。- 由于是在整数时间到达,可以立即换乘在第 1 小时发车的列车。- 由于是在整数时间到达,可以立即换乘在第 4 小时发车的列车。- 第 1 趟列车运行需要 1/3 = 0.33333 小时。不可能准时到达,因为第 3 趟列车最早是在第 2 小时发车。- 第 1 趟列车运行需要 1/1 = 1 小时。- 你将会恰好在第 6 小时到达。
2024-10-02 12:40:35
353
原创 MapReduce 和 Spark 相比的缺点
1. 中间结果写入磁盘(Materialization of Intermediate Results)MapReduce 需要将中间结果写入磁盘(例如 HDFS),以确保数据在节点故障时不丢失。虽然这种机制提高了可靠性,但频繁的磁盘 I/O 操作显著降低了性能,特别是在大规模数据处理的场景下。相比之下,Spark 将大部分中间数据保存在内存中,从而大大减少了磁盘读写的开销,速度更快。2. 任务链优化不足(Lack of Task Chain Optimization)在 MapReduce 中,
2024-09-30 12:52:47
761
1
原创 MapReduce简单介绍
MapReduce 是一种用于在集群上处理大规模数据集的编程模型。它广泛用于在多台机器上处理大数据,提供了一种并行化任务的方式。它在论文《MapReduce: Simplified Data Processing on Large Clusters》中被提出。
2024-09-30 12:49:37
704
原创 LeetCode-Python-LCP 40. 心算挑战
请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回 0。先找 happy path,看前 cnt 大的牌和是不是偶数, 如果是那么很好直接返回它。解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。1. 把已经拿走的牌里最小的偶数,换成自由牌里最大的奇数。2. 把已经拿走的牌里最小的奇数,换成自由牌里最小的偶数。张卡牌数字总和为偶数,则选手成绩「有效」且得分为。「力扣挑战赛」心算项目的挑战比赛中,要求选手从。解释:不存在获取有效得分的卡牌方案。
2024-09-18 12:35:24
317
原创 LeetCode-Python-3142. 判断矩阵是否满足条件
格子都满足以上条件,那么返回。网格图中所有格子都符合条件。你需要判断每一个格子。同一行中的格子值都相等。同一列中的格子值不相等。时间复杂度:O(MN)空间复杂度:O(1)
2024-09-18 12:21:38
377
原创 LeetCode-Python-2332. 坐上公交的最晚时间
所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。注意你不能跟其他乘客同一时间到达,所以你必须在第二位乘客之前到达。每位乘客都会搭乘下一辆有座位的公交车。第 2 辆公交车载着第 6 位和第 2 位乘客。先模拟上车的过程,然后从后往前找可以上车的位置。返回你可以搭乘公交车的最晚到达公交站时间。辆公交车的出发时间。第 2 辆公交车载着你和第 2 位乘客。第 3 辆公交车载着第 1 位乘客和你。第 1 辆公交车载着第 1 位乘客。第 1 辆公交车载着第 4 位乘客。到达的乘客优先上车。
2024-09-18 12:11:17
309
原创 系统设计DDIA之Chapter 7 Transactions 之防止丢失更新
丢失更新问题发生在两个或多个事务同时读取并修改相同数据的情况下,导致一个事务的更新被另一个事务无意中覆盖或“丢失”。这种情况通常出现在读取-修改-写入循环中,其中一个事务读取一个值,修改它,然后将修改后的值写回数据库。比较和设置操作是一种原子操作,用于防止没有完整事务支持的数据库中的丢失更新。有些数据库选择不自动检测丢失更新,以实现更好的性能、处理非关键或易于恢复的数据,提供更大的应用层灵活性,或适应不同的一致性要求。这样的原子操作直接修改计数器的值,不需要单独的读取和写入步骤,防止了丢失更新的风险。
2024-09-15 12:50:26
1650
原创 LeetCode-Python-2390. 从字符串中移除星号(栈)
给你一个包含若干星号*的字符串s。在一步操作中,你可以:选中s中的一个星号。移除星号左侧最近的那个非星号字符,并移除该星号自身。返回移除所有星号之后的字符串。
2024-09-15 11:38:41
328
原创 LeetCode-Python-2848. 与车相交的点(合并区间 + 桶排序)
这道题我们一直 start 和 end 的范围是 [1, 100],所以也可以用桶排序来做。1、2、3、5、6、7、8 共计 7 个点满足至少与一辆车相交,因此答案为 7。从 1 到 7 的所有点都至少与一辆车相交,因此答案为 7。每辆车的长度其实就是区间长度。每个桶里只要至少有一辆车,我们就把这个桶的值设为1。表示汽车停放在数轴上的坐标。最后只要找到有多少个桶里有车有ok。时间复杂度:O(NlogN)覆盖的整数点的数目。时间复杂度:O(NK)空间复杂度:O(1)空间复杂度:O(K)
2024-09-15 11:36:19
267
原创 LeetCode-Python-2576. 求出最多标记下标(二分试探)
根据贪心的思想,小数组里更小的数字应该尽可能匹配大数组更小的数字。第一次操作中,选择 i = 2 和 j = 1 ,操作可以执行的原因是 2 * nums[2] <= nums[1] ,标记下标 2 和 1。第一次操作中,选择 i = 3 和 j = 0 ,操作可以执行的原因是 2 * nums[3] <= nums[0] ,标记下标 3 和 0。第二次操作中,选择 i = 1 和 j = 2 ,操作可以执行的原因是 2 * nums[1] <= nums[2] ,标记下标 1 和 2。
2024-09-13 13:48:02
355
原创 LeetCode-Python-766. 托普利茨矩阵
在一条左上到右下的对角线上的点,有一个特征:它们 (x - y) 是固定的。比如说 (0, 0), (1, 1) 都有 x - y == 0。注意在对角线上移动是 [x, y] -> [x + 1, y + 1]。我们可以在内存里存储一个哈希表,它有(m + n - 1) 个key,value是对应的值。用这种方法,我们可以知道每个点在哪条对角线上,从而可以比较当前值和应有值。如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是。对角线 "[1, 2]" 上的元素不同。时间复杂度:O(MN)
2024-09-11 01:37:51
243
原创 LeetCode-Python-1151. 最少交换次数来组合所有的 1(滑动窗口)
给出一个二进制数组data,你需要通过交换位置,将数组中任何位置上的 1 组合到一起,并返回所有可能中所需最少的交换次数。
2024-09-09 07:49:11
358
原创 系统设计DDIA之Chapter 7 Transactions 之弱隔离级别之快照隔离
快照隔离和可重复读是用于管理数据库并发性的隔离级别,通过为每个事务提供一致的数据库视图来避免数据不一致的问题。以下是这两者的概述
2024-09-09 04:41:42
720
原创 系统设计DDIA之Chapter 7 Transactions 之弱隔离级别读已提交
数据库使用来在提供一定程度的并发问题防护的同时,提高性能。与提供严格隔离的可序列化隔离级别不同,弱隔离级别不保证所有类型的并发问题都被避免,但它们通常足够满足许多应用的需求,并且性能开销较低。在实现“读已提交”隔离级别时,数据库通常使用来防止脏写,并使用**多版本并发控制(MVCC)**来防止脏读。MVCC 通过维护多个数据版本(已提交的旧值和未提交的新值),确保在一个事务进行时,其他事务可以继续读取旧值,从而避免了性能问题。使用弱隔离级别的优点在于,它们在保持较高性能的同时,防止了一些常见的并发问题。
2024-09-09 01:44:31
783
原创 系统设计DDIA之Chapter 7 Transactions 之单对象和多对象操作
在数据库中,原子性和隔离性是ACID事务的关键属性,确保数据的可靠性和一致性:原子性保证事务要么完全完成,要么在发生故障时彻底回滚,以防止部分更新。隔离性确保并发事务不会相互干扰,产生与顺序执行相同的结果。
2024-09-09 01:19:52
796
原创 系统设计DDIA之Chapter 6 Partitioning 之请求路由
当数据在一个分布式数据库中被分区到多个节点上时,我们面临的主要挑战就是如何确定哪个节点持有处理客户端请求所需的数据。这一点非常关键,因为它确保请求能够被正确、高效地路由。解决请求路由问题有三种主要方法
2024-09-07 13:02:13
1052
原创 系统设计DDIA之Chapter 6 Partitioning 之全局二级索引和局部二级索引
先讲为什么要二级索引:在数据库里,一级索引可以很方便地对主键进行查找,但是如果我们想要根据除主键以外的属性进行搜索,那么我们就需要扫描整张表。显然这么弄效率很低,所以我们可以利用二级索引,来对非主键属性也实现快速搜索。比如,在一个二手车数据库中,我们可能经常需要根据颜色、品牌或车型来搜索汽车,而不仅仅是根据唯一的汽车ID。有了这些属性的二级索引,就可以快速找到匹配的所有记录。在这种方法中,每个分区都有自己的本地二级索引,只覆盖该分区内的文档。这种方式让写操作更简单,因为更新只影响一个分区。
2024-09-07 12:29:55
885
原创 LeetCode-Python-658. 找到 K 个最接近的元素
这道题的核心就是找到答案区间的左端点,因为长度已知是 k, 找到左端点后就可以确定答案区间。每次二分我们都是在判断从 arr[mid] 和 arr[mid + k] 之间取哪一个,因为它俩相隔 k + 1,所以两个中只可以取一个。我们会取离 x 更近的那个值,然后将区间减半。返回的结果必须要是按升序排好的。时间复杂度:O(logN),从数组中找到最靠近。空间复杂度:O(1)
2024-09-06 07:31:24
400
原创 系统设计DDIA之Chapter 6 Partitioning 之键值分区和哈希分区
按键范围分区是将一连串的键分配给每个分区,就像纸质百科全书把一部分字母(例如A-B、H-J)分配给每一卷。这种方式让我们在知道键的范围时可以很容易地找到数据,就像在百科全书中找到正确卷册中的词一样。
2024-09-05 14:04:44
672
原创 LeetCode-Python-384. 打乱数组(Knuth)
/ 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2]Knuth 算法,对于每一个 nums[i], 把它和 nums[j] 进行交换,j 是[i, len(nums) - 1]的随机数。// 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]// 重设数组到它的初始状态 [1, 2, 3]。返回 [1, 2, 3]时间复杂度:O(N)空间复杂度:O(N)
2024-08-29 12:06:37
323
1
原创 LeetCode-Python-1539. 第 k 个缺失的正整数(二分)
但是现在如果考虑它之前有缺失的情况,我们需要返回的就是 arr[right] + (k - (arr[right] - (right + 1))) = k + (right + 1) = k + left。对于一个 arr[i] 来说,它左边的缺失正整数的数量 n 应该是 = arr[i] - (i + 1)。缺失的正整数包括 [1,5,6,8,9,10,12,13,...]。假设 arr[right] 之前没有正整数缺失,我们直接返回 arr[right] + k 即可,时间复杂度:O(K + N)
2024-08-29 07:21:20
473
原创 LeetCode-Python-1650. 二叉树的最近公共祖先 III
“两个节点 p 和 q 在二叉树 T 中的最近公共祖先节点是后代节点中既包括 p 又包括 q 的最深节点(我们允许。指针 i 从 p1 出发,走两步到 c1, 再走两步到 q1, 再走一步到c1遇到 j,c1 即是答案。节点 5 和 4 的最近公共祖先是 5,根据定义,一个节点可以是自身的最近公共祖先。我们可以使用双指针,遍历到尾部之后跳转到另一个链表,第一个相同的节点就是答案。一个节点 x 的后代节点是节点 x 到某一叶节点间的路径中的节点 y。每个节点都包含其父节点的引用(指针)。
2024-08-24 13:44:37
616
1
原创 LeetCode-Python-680. 验证回文串 II
双指针从两端进行比较,如果发现不一致的,那么接下来就只有两种可能,删除左边的字符或者删除右边的字符,两种情况分别进行遍历,即可知道答案。是否能成为回文字符串:如果能,返回。你可以删除字符 'c'。可以从中删除一个字符。时间复杂度:O(N)空间复杂度:O(1)
2024-08-24 13:07:00
275
原创 LeetCode-Python-408. 有效单词缩写
单词 "internationalization" 可以缩写为 "i12iz4n" ("i。的子字符串替换为相应子串的长度。单词 "apple" 无法缩写为 "a2e"。,判断这个缩写是否可以是给定单词的缩写。经典双指针,按题意扫描即可。时间复杂度:O(M + N)的方法是将任意数量的。空间复杂度:O(1)
2024-08-24 13:05:12
226
原创 LeetCode-Python-314. 二叉树的垂直遍历
如果两个结点在同一行和列,那么顺序则为。给你一个二叉树的根结点,返回其结点按。(从上到下,逐列)遍历的结果。时间复杂度:O(N)空间复杂度:O(N)
2024-08-24 12:16:59
213
原创 LeetCode-Python-3133. 数组最后一个元素的最小值(位运算)
结合的方法是,从右往左,当 x 的二进制上出现 0 的时候,我们就把 n - 1 二进制的一位放进去。根据题意,数组里第一个数必定是 x, 其他的数的二进制除了 x 以外的AND运算结果应该为0。所以不难发现,题目所要求的答案就是把 n - 1 的二进制,跟 x 结合在一起。111, 可以观察到这个不同的部分其实就是 1, 2, 3..的二进制。我们不妨从简单的数字开始考虑,比如当 x = 111,即 7 的时候,,和之前一样新加上去的部分也是1, 2, 3, 4...下一个满足题意的数字应该是。
2024-08-24 11:47:51
247
原创 LeetCode-Python-3146. 两个字符串的排列差
用一个哈希表记录每个字符在一个字符串的下标,然后遍历另一个字符串即可。时间复杂度:O(N),where N <= 26。中每个字符在两个字符串中位置的绝对差值之和。,每个字符串中的字符都不重复,且。空间复杂度:O(N)
2024-08-24 11:40:25
350
原创 LeetCode-Python-3154. 到达第 K 级台阶的方案数(DFS + 数学)
已知我们一开始从 1 出发,可以进行 i 次减 1 操作,以及 j 次 jump 操作,最后需要到达 k。所以对于每一组(i, j) 来说,它们会形成的答案就是 Combination(j + 1, i)。可得:1(起点) + (2^0 + 2^1 + .. + 2^(j - 1)) - i = k。每走一步之后,新的子问题跟原问题相比,规模更小且类型相同,因此可以用 DFS 进行递归处理。递归的结束条件是,当 i 比 k + 1大时,终止搜索。时间复杂度:O(log(k) * log(k))
2024-08-20 12:55:13
1045
原创 LeetCode-Python-552. 学生出勤记录 II(DFS Memo + DP)
由 DFS 的 base 可知,DP[0] 对应的应该是 [[1, 1,1], [1, 1, 1]],即全为 1 的情况。可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。因此可以得到 DP 方程的维度是(n + 1)(2)(3),注意顺序和 DFS 的参数顺序相反。根据刚才的返回值 = dfs(n, 0, 0),所以现在的返回值是 DP[n][0][0]。L 只有三种可能(0, 1, 2), A 只有两种可能(0, 1),,表示出勤记录的长度(次数)。
2024-08-20 12:44:53
323
原创 LeetCodde-Python-712. 两个字符串的最小ASCII删除和
在 "leet" 中删除 "e" 将 101[e] 加入总和。如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403。在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。在 "delete" 中删除 "dee" 字符串变成 "let",在 "eat" 中删除 "t" 并将 116 加入总和。空间复杂度:O(MN)空间复杂度:O(MN)
2024-08-19 05:02:16
215
原创 LeetCode-Python-583. 两个字符串的删除操作
当一个字符串全部处理完毕之后,另一个字符串剩下的部分需要全部被删除,假设这个字符串当前下标是1,就代表还有(1 + 1)个字符没有被删除,对应递归结束的处理。如果两个 char 不同,那么我们肯定至少要删除一个字符(删除次数 + 1),具体删哪一个都有可能,所以两种可能都尝试一次。第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"如果两个 char 相同,那么不用删除,直接处理左侧剩余字符即可,时间复杂度:O(MN)空间复杂度:O(MN)空间复杂度:O(MN)
2024-08-19 04:48:29
503
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人