
力扣
文章平均质量分 58
追逐此刻
知其然 知其所以然
再坚持一下
在事上见
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
迪杰斯特拉算法
迪杰斯特拉(Dijkstra)算法是一种用于求解带权有向图或无向图中单个源节点到其他所有节点的最短路径的贪心算法。该算法要求图中所有边的权值非负,其核心思想是从源节点开始,逐步扩展到距离源节点最近的节点,并更新这些节点到源节点的最短距离,直到所有可达节点的最短距离都被确定。原创 2025-10-02 23:36:33 · 675 阅读 · 0 评论 -
[凸包]587. 安装栅栏
【代码】[凸包]587. 安装栅栏。原创 2025-10-02 16:19:19 · 80 阅读 · 0 评论 -
Jarvis 算法
在 Jarvis 算法中,我们从最左边的点开始,不断寻找相对于当前点具有最小极角的点作为下一个凸包上的点,重复这个过程,直到回到起始点,从而构建出整个凸包。这段代码就是实现这个过程的具体逻辑。这段代码通过不断循环,从当前点出发,遍历所有点,找到相对于当前点具有最小极角的点作为下一个凸包点,直到回到起始点,从而构建出完整的凸包。凸包是包含给定点集的最小凸多边形。凸多边形的一个重要性质是,对于多边形上的任意一条边,多边形上的所有其他点都位于这条边的同一侧。原创 2025-10-01 23:21:54 · 888 阅读 · 0 评论 -
[栈模拟]2197. 替换数组中的非互质数
由于 LCM 本质是质因数分解中质数的指数取最大值。两数的乘积 = 最大公约数 × 最小公倍数。对于任意一种合并顺序,我们总是可以将该顺序。原创 2025-09-16 23:50:57 · 258 阅读 · 0 评论 -
如何计算最大公约数和最小公倍数
在数学中,最大公约数(Greatest Common Divisor,GCD)是指两个或多个整数共有约数中最大的一个;最小公倍数(Least Common Multiple,LCM)是指两个或多个整数公有的倍数中最小的一个。下面为你介绍计算最大公约数和最小公倍数的多种方法。原创 2025-09-16 23:21:18 · 474 阅读 · 0 评论 -
两数的乘积 = 最大公约数 × 最小公倍数
我们可以通过对两个数进行质因数分解,从数学原理上推导证明“两数的乘积等于它们的最大公约数与最小公倍数的乘积”这一结论。最小公倍数是包含两个数所有质因数的乘积,且每个质因数的指数取两个数中该。最大公约数是两个数公有的质因数的乘积,且每个质因数的指数取两个数中该。通过以上推导可知,两数的乘积等于它们的最大公约数与最小公倍数的乘积。可以看到,两数的乘积确实等于它们的最大公约数与最小公倍数的乘积。原创 2025-09-16 23:16:09 · 296 阅读 · 0 评论 -
28. 找出字符串中第一个匹配项的下标
看到题目,在字符串中找到子串并返回第一个下标,没有则返回-1。那么如何在字符串中找到子串,则需要匹配。题解在匹配字符串第一个字母时,利用字符串的长度,来判断字符串中是否含有子串。原创 2025-09-19 23:50:54 · 296 阅读 · 0 评论 -
[哈希表]966. 元音拼写检查器
【代码】[哈希表]966. 元音拼写检查器。原创 2025-09-14 22:47:49 · 332 阅读 · 0 评论 -
[差分数组]2327. 知道秘密的人数
diff = [0] * (n + 2) # 差分数组,长度 n+2 防越界diff[1] = 1 # 第 1 天新增 1 人diff[2] = -1 # 差分结束标记ans = 0know = 0 # 当前知道秘密的总人数for i in range(1, n + 1): # 遍历每一天know = (know + diff[i]) % MOD # 更新当前知道人数if i >= n - forget + 1: # 最后 forget 天内的人未忘记。原创 2025-09-09 23:50:07 · 896 阅读 · 0 评论 -
差分数组(Difference Array)
初始化: 根据原始数组arr构造差分数组diff。区间修改: 当需要对arr的区间[l, r]增加k(时间复杂度 O(1))查询(还原): 当需要知道修改后的arr[i]的值时,或者需要得到整个修改后的数组时,对差分数组diff求前缀和得到arr。(查询单个元素 O(1) - 如果维护了前缀和数组;还原整个数组 O(n))差分数组是一种通过存储相邻元素差值来优化数组区间修改操作的技术。原创 2025-09-09 23:11:36 · 995 阅读 · 0 评论 -
KMP算法
听完之后,你至能知道kmp算法的原理是什么样的。他是怎么做到比较的指针不需要回溯。并且听完之后你会求next的数组。到这里来应对一般校的kmp算法考题就足够了。这节课仅仅是初步理解,让你学完之后感觉眼前一亮。什么是kmp算法?就是快速的从一个主串中找出你想要的子串。下面的串叫做模式串。Camp算法就是从主串中快速找到模式串。kmp算法强调一个快字,不快的话叫做幼稚模式串匹配算法。(幼稚模式串匹配算法也是最直观的,最容易想到的算法)原创 2024-08-04 20:42:46 · 938 阅读 · 0 评论 -
541. 反转字符串 II | 151. 反转字符串中的单词
规则:这个规则是给我们一个字符串。让我们把前2k段中前k段进行反转。如果末尾不够两k段,但是超过1k这个长度,则把前k段进行反转。如果没超过1k这个长度,则把尾部段进行反转。为什么很多同学在写这个代码的时候会写的很复杂?因为同学们在店里这个字符串的时候很习惯的去写i++。其实我们这道题在每次遍历的时候都是以2k进行增加的,每次都是2k段。所以这里没有必要去写i++是要写i+=2k,直接让i以2k去移动,在每次操作的时候操作前k个就可以了。相当于操作i到i+k段这个字符串的距离。原创 2024-07-30 12:00:40 · 1214 阅读 · 0 评论 -
202. 快乐数 |454. 四数相加 II
divmod()原创 2024-07-29 23:13:06 · 1023 阅读 · 0 评论 -
59.螺旋矩阵II
把最后一个节点留给下一条边,作为下一条边的起始位置,大家会发现我转一圈,其实是坚持一个原则,这都是左闭右开,这样我四条边的遍历规则就统一了,把规则统一之后,代码就很好写了。Python中的一个列表推导式(list comprehension),用于创建一个二维列表(或称为矩阵),其大小为n×n,并且初始时所有元素都被初始化为0。模计算经常用于判断一个数是否可以被另一个数整除(如果余数为0,则可以整除),以及循环索引的计算(如循环遍历数组时,将索引保持在数组长度内的操作): 这是一个循环,循环n次。原创 2025-09-12 23:06:27 · 1040 阅读 · 0 评论 -
242. 有效的字母异位词| 349. 两个数组的交集
如0,100万,如果用数组来做映射的话,要用100万那么大的数组,但实际运用的只有三个。加了这个限制之后,这道题目用数组来求解,用哈希表的结构是比较合适的。当这里面的数值非常大的时候,我们想用数组来做映射就不合适了。然而,由于哈希表的性质,它在平均情况下的插入、删除和查找操作都具有常数时间复杂度(尽管在最坏情况下可能会退化到线性时间复杂度,但这通常不会发生)。它存储的元素是唯一的,且按照一定的顺序(默认情况下是升序,但可以通过自定义比较函数来改变)进行存储。也是基于红黑树实现的,但它允许存储重复的元素。原创 2025-09-13 23:39:17 · 1891 阅读 · 0 评论 -
[回溯+堆优化]37. 解数独
否则,撤销填入(从集合中移除x,并且注意board中这个位置要恢复为空,但因为我们后面会重新覆盖,所以可以不用立即恢复,但为了清晰,我们在回溯时也可以恢复,但这里我们采用覆盖的方式,所以不恢复board,因为下一次填入会覆盖)。如果所有候选数字都不行,则将该空格重新加入堆中(因为候选数可能变化,我们重新计算候选数个数并入堆),然后返回False(失败)。给定的数独是一个9x9的二维数组,其中空格用 '.' 表示,并且题目保证只有唯一解。递归调用dfs,如果返回True,则直接返回True(成功)。原创 2025-08-31 22:43:57 · 401 阅读 · 0 评论 -
[数组]27.移除元素
而是里面有一个计数器,你调用了erease之后,里面的计数器默认进行了--的操作,所以返回了4,实际上它的物理空间还是原来那样,最后一个元素,仅仅是没有做处理而已。而while循环则是通过循环条件来决定是否执行循环,如果循环条件是True的话就会一直执行循环,否则就会结束循环,所以while循环的适用场景是:你有一个循环条件,你知道只要这个条件成立就要循环执行某些操作,那在这种情况下使用while循环是最合适的。使用双指针的写法可以用O(n)的方式来实现删除数组中的元素(=erase的方式来删除元素)原创 2025-08-29 22:28:54 · 919 阅读 · 0 评论 -
3471. 找出最大的几近缺失整数
【代码】3471. 找出最大的几近缺失整数。原创 2025-08-29 22:29:05 · 302 阅读 · 0 评论 -
1504. 统计全 1 子矩形
(灵神题解)原创 2025-08-26 23:52:20 · 202 阅读 · 0 评论 -
[滑动窗口]1493. 删掉一个元素以后全为 1 的最长子数组
给定一个二进制数组nums,你需要从中删除一个元素(必须删除一个,且只能删除一个),返回最长的且只包含1的非空子数组的长度。如果不存在这样的子数组,返回0。注意:删除一个元素后,剩下的元素需要是连续的(因为是子数组)。实际上,问题可以转化为:在数组中找一个子数组,这个子数组最多只能包含一个0,然后这个子数组的长度减1(因为我们要删除一个元素)就是候选答案。但是注意,如果整个数组都是1,那么删除一个元素后,长度是原长度减1。原创 2025-08-24 17:17:27 · 403 阅读 · 0 评论 -
[二维前缀和]1277. 统计全为 1 的正方形子矩阵
问题是计算一个二进制矩阵中所有由1组成的正方形的数量。函数名为countSquares,输入是二维列表matrix,输出是整数。解决方案使用动态规划。我们创建一个二维数组f,其维度比matrix多一行和一列,即(m+1) x (n+1),初始化为0。f[i][j]表示以(i-1, j-1)为右下角的最大正方形的边长。因为f的索引从1开始,对应matrix的0索引。遍历matrix中的每个元素,如果当前元素x为1,则更新。原创 2025-08-24 14:12:37 · 758 阅读 · 0 评论 -
[二维前缀和]304. 二维区域和检索 - 矩阵不可变
【代码】[二维前缀和]304. 二维区域和检索 - 矩阵不可变。原创 2025-08-24 06:47:58 · 326 阅读 · 0 评论 -
「越短越合法」型滑动窗口
也被称为 。其核心特点是:。原创 2025-08-22 23:35:39 · 946 阅读 · 0 评论 -
[递归回溯]679. 24 点游戏
核心思想是使用递归和回溯。每次递归调用时,我们从列表中取出两个数(通过队列的方式,即每次弹出第一个元素),然后对这两个数进行四则运算(加、减、乘、除),将运算结果放回列表中,然后递归处理新的列表(长度减少1)。当列表只剩下一个数时,我们检查它是否接近24(使用。原创 2025-08-20 23:42:41 · 282 阅读 · 0 评论 -
[滑动窗口]837. 新 21 点
:定义。原创 2025-08-18 07:46:19 · 422 阅读 · 0 评论 -
[数学]1780. 判断一个数字是否可以表示成三的幂的和
因为我们常用的二进制转成十进制,就是采用二的幂之和来计算获得。反之,十进制转二进制,二进制中每个数(0或1),就表示二的幂,二的幂之和为十进制。要判断n是否满足三的幂之和,与求二的幂之和类似。同理,可以采用三进制计算的方式来解这题。原创 2025-08-14 00:11:46 · 336 阅读 · 0 评论 -
[0-1背包]2787. 将一个数字表示成幂的和的方案数
把 n 看成背包容量,1x,2x,3x,… 看成物品,本题是恰好装满型的方案数当处理大数计算时(特别是涉及组合数、阶乘等),结果可能会非常大,容易超出标准数据类型的表示范围。常见的解决方案是在每一步计算后都进行取模运算,以防止数值溢出。对于这个特定问题,即使在"最坏情况"下(即计算结果最大的情况),答案也不会超过某种整数类型(如64位整数)的最大值。因此可以推迟取模操作,等到所有计算完成后再进行一次取模,而不需要在中间步骤频繁取模。原创 2025-08-12 20:07:19 · 496 阅读 · 0 评论 -
2438. 二的幂数组中查询范围内的乘积
在这种表示中,每个2的幂最多出现一次,因为二进制每一位只能是0或1。这种表示方法已经使用了最少数量的2的幂(因为不能合并相同的幂次)。然而,题目允许数组中的元素可以重复(因为是非递减顺序,可以连续相同),但要求最少数目。:数组中的每个元素都是 2 的幂。逆元的计算可以通过费马小定理:inv(a) = pow(a, MOD-2, MOD)。都可以表示为若干个不同的2的幂的和,这实际上就是。6 的二进制是 110,可以表示为 4+2=6。的位对应的2的幂按从小到大的顺序排列。原创 2025-08-11 23:46:09 · 1155 阅读 · 0 评论 -
[枚举]869. 重新排序得到 2 的幂
【代码】[枚举]869. 重新排序得到 2 的幂。原创 2025-08-10 23:25:37 · 1177 阅读 · 0 评论 -
[概率 DP]808. 分汤
根据「寻找子问题」,定义 dfs(a,b) 表示两种汤的剩余量分别为 a 毫升和 b 毫升时,目标事件发生的概率。在当前回合,我们等概率地选择以下四种操作中的一种执行:从汤 A 取 100 毫升,从汤 B 取 0 毫升。问题变成两种汤的剩余量分别为 a−100 毫升和 b 毫升时,目标事件发生的概率,即 dfs(a−100,b)。从汤 A 取 75 毫升,从汤 B 取 25 毫升。原创 2025-08-09 22:51:08 · 752 阅读 · 0 评论 -
[链表]142. 环形链表 II
快指针每次走两个节点。那么快指针一定先进入这个环,然后慢指针才进入这个环。快指针一定会去追慢指针。快指针每次相对于慢指针走一个节点,所以他们一定会相遇,而不会让快指针跳过慢指针。因为快指针每次相对于慢指针走两个节点可能就跳过了。快指针每次走两个节点,慢指针每次走一个节点。如果这个链表有环,那么他们一定会在环里相遇。如果一个链表没有环,是一条直线,快慢指针速度不同,那么快慢指针是不可能相遇的;除非这个链表有环让快指针绕圈了,随后慢指针也进入这个圈,然后两个指针相遇。如果快慢指针相遇了,说明这个链表有环。原创 2025-08-08 23:37:48 · 435 阅读 · 0 评论 -
[网格图DP]3363. 最多可收集的水果数目
3363. 最多可收集的水果数目原创 2025-08-07 23:34:15 · 167 阅读 · 0 评论 -
[滑动窗口]904. 水果成篮
要求说明🍎 水果种类用数组表示fruits[i]是第 i 棵树的水果类型(用整数表示)🧺 只能带两个篮子只能收集 两种不同类型的水果🌳 必须从某棵树开始向右连续采摘不能跳过中间的树🚫 不能遇到第三种水果类型一旦遇到第 3 种类型的水果,就必须停止采摘✅ 目标找到最长的一段连续的树,其水果种类不超过两种,返回这段树的个数(即水果数量)这道题是让你在一排树中,找到最长的连续一段树,这些树上的水果种类不超过两种,返回这段树的数量。本质是求 最多包含两个不同元素的最长子数组长度。原创 2025-08-06 23:47:35 · 1208 阅读 · 0 评论 -
[数组]977.有序数组的平方;209.长度最小的子数组
终止位置随for循环一个个向后移动,什么时候移动起始位置?如果终止位置指向一个地方,集合中的元素大于等于target,说明这是符合条件的一个集合,知道长度之后,起始位置就可以向后移动了 ,这样来缩小目前的这个集合,看下一个集合是否符合条件。也就是说,当我们发现集合中的所有元素和大于等于target的时候,再去移动起始位置;通过动态调整起始位置来收集不同长度区间里边的和。接②:这也是滑动窗口的精华所在;滑动窗口最重要的一个思路就是。209.长度最小的子数组。原创 2025-08-05 23:50:09 · 458 阅读 · 0 评论 -
203.移除链表元素 707.设计链表 206.反转链表
203.移除链表元素链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。性能分析链表的特性和数组的特性进行一个对比,如图所示:这道题就是给大家一个链表,移除链表中等于某个target的所有节点。然后返回这个链表的头节点。如果我们删除这个节点的话,让这个节点的前一个节点,指向这个节点的下一个节点。这样我们就把这个元素从列表中移除了。这个节点是c++的话,我们要手动把这个节点的内存给原创 2025-08-05 23:49:41 · 585 阅读 · 0 评论 -
2106. 摘水果
该解决方案通过滑动窗口和二分查找高效地找到了在最多k步内能收集到的最大水果数量。关键在于如何通过两个步数条件来调整窗口的左右边界,确保移动步数的限制被满足。原创 2025-08-03 22:17:01 · 809 阅读 · 0 评论 -
1. 两数之和
无原创 2025-08-02 23:31:31 · 425 阅读 · 2 评论 -
704. 二分查找
【代码】【代码随想录】01数组,704. 二分查找。原创 2025-08-02 23:30:59 · 185 阅读 · 0 评论 -
[位运算]2411. 按位或最大的最小子数组长度
的增加),其按位或运算的结果是单调不减的。这是因为每次或上一个非负整数,只会增加或保持当前的二进制。按位或运算(Bitwise OR)是对两个数的二进制表示的每一位进行或运算。最优解法可能需要更高级的技巧,如利用位运算的性质进行优化。按位或运算的一个重要性质是:对于一个子数组,随着子数组的扩展(即。时的子数组是最长的。可能需要预处理或利用动态规划的思想。但是,这与题目描述中的“最小子数组”似乎矛盾,因为。但这种方法较为复杂,可能需要更深入的理解。,因为整数的位数是固定的(如 32 位)。原创 2025-08-01 21:28:54 · 1069 阅读 · 0 评论 -
位或操作(|)的非递减性
是所有数字的或,也是最大的可能值。,而不会减少任何位。原创 2025-07-30 00:17:44 · 406 阅读 · 0 评论