自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Keep Coding

点关注,不迷路 ↓↓↓❤️

  • 博客(927)
  • 收藏
  • 关注

原创 刷题小白入门攻略

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

2023-07-20 08:39:09 652

原创 写于LeetCode刷完900题之际的感想

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

2019-11-01 08:35:52 7504 10

原创 Python爬虫抓取LeetCode题解,获取力扣中国(leetcode-cn.com)提交代码,自动保存submission到本地,同步上传到github

力扣中国虽然可以和github绑定账号,但是我提交的题解并不能同步到github上……辛辛苦苦三个月,勤勤恳恳四百题,leetcode一片绿,github万里白。手动上传是不可能手动上传的,这辈子也懒得手动上传。找了一圈只能找到 Leetcode 的提交爬虫,没有力扣中国的,所以只能自己造轮子了。学了两天爬虫鼓捣了这么个东西出来,我用的蛮顺手的,希望你们也能用的顺手。项目地址:...

2019-05-24 19:13:40 5243 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 3615

原创 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 105208 12

原创 LeetCode-Python-LCP 40. 心算挑战

请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回 0。先找 happy path,看前 cnt 大的牌和是不是偶数, 如果是那么很好直接返回它。解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。1. 把已经拿走的牌里最小的偶数,换成自由牌里最大的奇数。2. 把已经拿走的牌里最小的奇数,换成自由牌里最小的偶数。张卡牌数字总和为偶数,则选手成绩「有效」且得分为。「力扣挑战赛」心算项目的挑战比赛中,要求选手从。解释:不存在获取有效得分的卡牌方案。

2024-09-18 12:35:24 165

原创 LeetCode-Python-3142. 判断矩阵是否满足条件

格子都满足以上条件,那么返回。网格图中所有格子都符合条件。你需要判断每一个格子。同一行中的格子值都相等。同一列中的格子值不相等。时间复杂度:O(MN)空间复杂度:O(1)

2024-09-18 12:21:38 216

原创 LeetCode-Python-2332. 坐上公交的最晚时间

所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。注意你不能跟其他乘客同一时间到达,所以你必须在第二位乘客之前到达。每位乘客都会搭乘下一辆有座位的公交车。第 2 辆公交车载着第 6 位和第 2 位乘客。先模拟上车的过程,然后从后往前找可以上车的位置。返回你可以搭乘公交车的最晚到达公交站时间。辆公交车的出发时间。第 2 辆公交车载着你和第 2 位乘客。第 3 辆公交车载着第 1 位乘客和你。第 1 辆公交车载着第 1 位乘客。第 1 辆公交车载着第 4 位乘客。到达的乘客优先上车。

2024-09-18 12:11:17 150

原创 系统设计DDIA之Chapter 7 Transactions 之防止丢失更新

丢失更新问题发生在两个或多个事务同时读取并修改相同数据的情况下,导致一个事务的更新被另一个事务无意中覆盖或“丢失”。这种情况通常出现在读取-修改-写入循环中,其中一个事务读取一个值,修改它,然后将修改后的值写回数据库。比较和设置操作是一种原子操作,用于防止没有完整事务支持的数据库中的丢失更新。有些数据库选择不自动检测丢失更新,以实现更好的性能、处理非关键或易于恢复的数据,提供更大的应用层灵活性,或适应不同的一致性要求。这样的原子操作直接修改计数器的值,不需要单独的读取和写入步骤,防止了丢失更新的风险。

2024-09-15 12:50:26 1546

原创 LeetCode-Python-2390. 从字符串中移除星号(栈)

给你一个包含若干星号*的字符串s。在一步操作中,你可以:选中s中的一个星号。移除星号左侧最近的那个非星号字符,并移除该星号自身。返回移除所有星号之后的字符串。

2024-09-15 11:38:41 224

原创 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 174

原创 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 272

原创 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 188

原创 LeetCode-Python-1151. 最少交换次数来组合所有的 1(滑动窗口)

给出一个二进制数组data,你需要通过交换位置,将数组中任何位置上的 1 组合到一起,并返回所有可能中所需最少的交换次数。

2024-09-09 07:49:11 236

原创 系统设计DDIA之Chapter 7 Transactions 之弱隔离级别之快照隔离

快照隔离和可重复读是用于管理数据库并发性的隔离级别,通过为每个事务提供一致的数据库视图来避免数据不一致的问题。以下是这两者的概述

2024-09-09 04:41:42 643

原创 系统设计DDIA之Chapter 7 Transactions 之弱隔离级别读已提交

数据库使用来在提供一定程度的并发问题防护的同时,提高性能。与提供严格隔离的可序列化隔离级别不同,弱隔离级别不保证所有类型的并发问题都被避免,但它们通常足够满足许多应用的需求,并且性能开销较低。在实现“读已提交”隔离级别时,数据库通常使用来防止脏写,并使用**多版本并发控制(MVCC)**来防止脏读。MVCC 通过维护多个数据版本(已提交的旧值和未提交的新值),确保在一个事务进行时,其他事务可以继续读取旧值,从而避免了性能问题。使用弱隔离级别的优点在于,它们在保持较高性能的同时,防止了一些常见的并发问题。

2024-09-09 01:44:31 722

原创 系统设计DDIA之Chapter 7 Transactions 之单对象和多对象操作

在数据库中,原子性和隔离性是ACID事务的关键属性,确保数据的可靠性和一致性:原子性保证事务要么完全完成,要么在发生故障时彻底回滚,以防止部分更新。隔离性确保并发事务不会相互干扰,产生与顺序执行相同的结果。

2024-09-09 01:19:52 722

原创 系统设计DDIA之Chapter 6 Partitioning 之请求路由

当数据在一个分布式数据库中被分区到多个节点上时,我们面临的主要挑战就是如何确定哪个节点持有处理客户端请求所需的数据。这一点非常关键,因为它确保请求能够被正确、高效地路由。解决请求路由问题有三种主要方法

2024-09-07 13:02:13 985

原创 系统设计DDIA之Chapter 6 Partitioning 之全局二级索引和局部二级索引

先讲为什么要二级索引:在数据库里,一级索引可以很方便地对主键进行查找,但是如果我们想要根据除主键以外的属性进行搜索,那么我们就需要扫描整张表。显然这么弄效率很低,所以我们可以利用二级索引,来对非主键属性也实现快速搜索。比如,在一个二手车数据库中,我们可能经常需要根据颜色、品牌或车型来搜索汽车,而不仅仅是根据唯一的汽车ID。有了这些属性的二级索引,就可以快速找到匹配的所有记录。在这种方法中,每个分区都有自己的本地二级索引,只覆盖该分区内的文档。这种方式让写操作更简单,因为更新只影响一个分区。

2024-09-07 12:29:55 786

原创 LeetCode-Python-658. 找到 K 个最接近的元素

这道题的核心就是找到答案区间的左端点,因为长度已知是 k, 找到左端点后就可以确定答案区间。每次二分我们都是在判断从 arr[mid] 和 arr[mid + k] 之间取哪一个,因为它俩相隔 k + 1,所以两个中只可以取一个。我们会取离 x 更近的那个值,然后将区间减半。返回的结果必须要是按升序排好的。时间复杂度:O(logN),从数组中找到最靠近。空间复杂度:O(1)

2024-09-06 07:31:24 337

原创 系统设计DDIA之Chapter 6 Partitioning 之键值分区和哈希分区

按键范围分区是将一连串的键分配给每个分区,就像纸质百科全书把一部分字母(例如A-B、H-J)分配给每一卷。这种方式让我们在知道键的范围时可以很容易地找到数据,就像在百科全书中找到正确卷册中的词一样。

2024-09-05 14:04:44 571

原创 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 276 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 446

原创 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 372

原创 LeetCode-Python-680. 验证回文串 II

双指针从两端进行比较,如果发现不一致的,那么接下来就只有两种可能,删除左边的字符或者删除右边的字符,两种情况分别进行遍历,即可知道答案。是否能成为回文字符串:如果能,返回。你可以删除字符 'c'。可以从中删除一个字符。时间复杂度:O(N)空间复杂度:O(1)

2024-08-24 13:07:00 225

原创 LeetCode-Python-408. 有效单词缩写

单词 "internationalization" 可以缩写为 "i12iz4n" ("i。的子字符串替换为相应子串的长度。单词 "apple" 无法缩写为 "a2e"。,判断这个缩写是否可以是给定单词的缩写。经典双指针,按题意扫描即可。时间复杂度:O(M + N)的方法是将任意数量的。空间复杂度:O(1)

2024-08-24 13:05:12 165

原创 LeetCode-Python-314. 二叉树的垂直遍历

如果两个结点在同一行和列,那么顺序则为。给你一个二叉树的根结点,返回其结点按。(从上到下,逐列)遍历的结果。时间复杂度:O(N)空间复杂度:O(N)

2024-08-24 12:16:59 149

原创 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 208

原创 LeetCode-Python-3146. 两个字符串的排列差

用一个哈希表记录每个字符在一个字符串的下标,然后遍历另一个字符串即可。时间复杂度:O(N),where N <= 26。中每个字符在两个字符串中位置的绝对差值之和。,每个字符串中的字符都不重复,且。空间复杂度:O(N)

2024-08-24 11:40:25 317

原创 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 1006

原创 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 242

原创 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 194

原创 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 462

原创 LeetCode-Python-624. 数组列表中的最大距离

线性遍历输入数组,由于每个数组是严格递增的,所以对于每个当前数组,如果我们已知之前的最小值和最大值,则可以快速求出当前的最大距离 = max(abs(arr[-1] - min), abs(arr[0] - max))现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。abs(arr[-1] - min) 对应的是以右端点构成的最大距离的情况,abs(arr[0] - max) 对应的是以左端点构成的最大距离的情况。时间复杂度:O(N)空间复杂度:O(1)

2024-08-19 04:05:58 189

原创 LeetCode-Python-3137. K 周期字符串需要的最少操作次数

假设我们最终能使得 word 由 一个substring 重复组成,那么想要得到最少的操作次数就等价于找到在原 word 中出现次数最多的 substring。可以选择 i = 4 和 j = 0 获得一个 4 周期字符串。这次操作后,word 变为 "leetleetleet"。所以这道题转化为,在输入字符串里找长度为 k 的且出现次数最多的子字符串。可以执行以下操作获得一个 2 周期字符串。在一次操作中,你可以选择任意两个下标。时的 2 周期字符串。时间复杂度:O(N)空间复杂度:O(N)

2024-08-17 01:50:45 182

原创 LeetCode-Python-3152. 特殊数组 II

这样做的好处是,给定一个子数组 [s, e],我们可以简单地用 dp[e] - dp[s] == [e - s] 来判断它是不是特殊数组。如果两个相邻元素的奇偶性不同,那么必有 nums[i - 1] ^ nums[i] & 1 == 1,即二进制的最后一位数字的异或值必为1。因此我们可以用一个 dp 数组来记录原数组的连续奇偶性,如果两个相邻元素的奇偶性不同,就让dp 数组在前一位的基础上 + 1, 否则不变。时间复杂度:O(NQlog(N) ~ O(N^2log(N))空间复杂度:O(N)

2024-08-16 13:10:32 438

原创 LeetCode-Python-2961. 双模幂运算

1) 对于下标 0 ,variables[0] = [39,3,1000,1000] ,(393 % 10)1000 % 1000 = 1。1) 对于下标 0 ,variables[0] = [2,3,3,10] ,(23 % 10)3 % 10 = 2。2) 对于下标 1 ,variables[1] = [3,3,3,1] ,(33 % 10)3 % 1 = 0。3) 对于下标 2 ,variables[2] = [6,1,1,4] ,(61 % 10)1 % 4 = 2。按题意模拟计算即可。

2024-08-16 12:39:11 219

原创 LeetCode-Python-3128. 直角三角形

以每一个 1 元素作为直角顶点能形成的直角三角形的个数,等于(当前行的 1 的数量 - 1) * (当前列的 1 的数量 - 1)。所以这道题等价于找每一行和每一列 1 出现的次数。给你一个二维 boolean 矩阵。中的 3 个元素可以构建的。数目,且满足 3 个元素值。空间复杂度:O(M + N)有 2 个直角三角形。时间复杂度:O(MN)

2024-08-16 09:53:03 255

原创 LeetCode-Python-3223. 操作后字符串的最短长度

具体删除哪一个字符是无所谓的,对于每个字符来说,如果它出现的次数是奇数次,比如 3, 5,那么最后它就会剩下 1 个字符。对于偶数次的情况,比如 2, 4,那么它最后只会剩下 2 个字符。另一种思路是只要频率大于等于3就减 2,最后看能剩下几个。无法对字符串进行任何操作,所以返回初始字符串的长度。请你返回执行完所有操作后,时间复杂度:O(N)空间复杂度:O(1)

2024-07-27 11:38:12 254

原创 LeetCode-Python-3222. 求出硬币游戏的赢家

Alice 和 Bob 正在玩一个游戏。每一轮中,Alice 先进行操作,Bob 后操作。每次操作中,玩家需要拿出价值。为 115 的硬币。如果一名玩家无法执行此操作,那么这名玩家。能组成 75 的方法只有一种,一个 45 加上四个 10。,分别表示价值为 75 和 10 的硬币的数目。策略,请你返回游戏的赢家。时间复杂度:O(N)空间复杂度:O(1)

2024-07-27 11:35:19 206

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除