- 博客(55)
- 收藏
- 关注
原创 leetcode 3075(排序+贪心)
本质上,由于存在 max(0,...) 这个 “截断” 机制,越小的值越容易触发 “保底 0”。为了保护总和,我们应该。每个孩子被选中时,其贡献是 max(0, 初始值 - 已经过去的轮数);,让那些迟早要变成 0的小值去承担减量。3075: 幸福值最大化的选择方案。只能选k个,优先选择较大的。
2025-12-25 23:46:44
31
原创 leetcode 3074
的箱子中,那就先把所有苹果堆在一起,然后一个个地装箱。为了少用箱子,要先装大箱子,再装小箱子。注:题目保证可以将所有苹果重新分装到箱子中。既然同一个包裹中的苹果可以分装到。3074: 重新分装苹果。
2025-12-24 16:47:57
117
原创 leetcode 2054(排序 + 单调栈,通用做法是 DP)
枚举第二个活动,在单调栈中二分查找结束时间严格小于 startTime 的最后一个活动,即为价值最大的第一个活动。单调栈递增,如果找不到,因为有“栈底哨兵”,因此找不到满足条件的活动时,it={0,0},it->second=0,不会越界。把这些活动记录到一个栈(列表)中,那么从栈底到栈顶,结束时间是递增的,价值也是递增的,非常适合。题意:在结束时间小于 startTime 的活动中,选择价值最大的活动。活动二的结束时间又晚,价值又小,全方面不如活动一,是垃圾数据,直接忽略。
2025-12-23 18:24:35
118
原创 leetcode 960
思路:求删除最少,考虑最多能保留多少列;动态规划dp,问题等价于计算数组 strs 中的所有字符串的。,这里的公共的含义是下标相同。最长公共递增子序列的长度。960: 删列造序Ⅲ。
2025-12-22 12:03:28
77
原创 leetcode 955
第一列是升序,不删;对于第二列,此时第二列分成了两组 [c,d] 和 [a,b],只需判断组内字母是不是升序,而不是完整地比较第二列的四个字母。题意:在执行删除操作之后,最终得到的数组的元素是按。955: 删列造序Ⅱ。
2025-12-22 00:03:41
199
原创 leetcode 2092(排序+bfs)
解读:在同一时间发生的所有会议,可以视作一个无向图。专家是图中的节点,meetings[i] 是图的边,连接 xi 和 yi。这个图可能有多个连通块。每个连通块只要有一个人知道秘密,那么整个连通块的人都能知道秘密。假设一开始 0 和 1 知道秘密。2092: 找出知晓秘密的所有专家。思路:排序+bfs广度优先搜索。
2025-12-19 16:32:51
190
原创 leetcode 3652(定长滑动窗口/前缀和)
对于价格 p,如果修改前策略是 x,修改后策略是 y,那么利润增加了 p⋅(y−x)。比如原来买入,现在持有(不买入),那么利润增加了 p⋅(0−(−1))=p。又比如原来买入,现在卖出,那么利润增加了 p⋅(1−(−1))=2p。这里可能出现 maxSum<0 的情况,此时不修改更好,也就是与 0 取最大值。下面计算每个窗口的 sum,考察从 [i−k,i−1] 向右滑到 [i−k+1,i],sum 如何变化。思路:定长滑动窗口 / 前缀和,枚举修改子数组 [i−k,i−1]
2025-12-18 17:42:47
138
原创 leetcode 3573(买卖股票问题,状态机dp)
此外,对于 dfs(i,j,0),在计算最大值时额外考虑在第 i 天买回股票(平空)的情况,即 dfs(i,j,2)−prices[i]。下标 0~k+1(三个状态 - 二维数组)3573: 买卖股票的最佳时机Ⅴ。思路:状态机(买卖股票问题)
2025-12-17 18:02:28
159
原创 leetcode 3562(树上背包 + 状态机)
注:数据范围说 hierarchy.length == n - 1,且 员工 1 是所有员工的直接或间接上司,所以输入是一个 n 点 n−1 边的连通图,即树。站在节点 x 上,讨论是否购买 present[x]。设节点 y 是节点 x 的儿子。注意这里用了 0-1 背包的空间优化(倒序遍历 | 至多)subF[j][k]。x 的所有儿子子树 y 的最大利润总和。3562: 折扣价交易股票的最大利润。的子树看作一个「物品组」,体积是。取决于 x 的父节点有没有买股票。,能得到的 最大净利润。
2025-12-16 18:19:35
678
原创 leetcode 2147
一般地,对于第 3,5,7,…个座位,可以在其到其左侧最近座位之间的任意空隙放置一个屏风,空隙个数为两个座位的下标之差。总的方案数为每个屏风的放法之积。在示例 1 中,我们可以在第 2 个座位和第 3 个座位之间的任意空隙放置一个屏风,空隙个数为两个座位的下标之差 4−1=3。2.一共有奇数个座位。这会导致某一段只有一个座位,不满足要求。不满足题目「每一段内都恰好有两个座位」的要求。2147: 分割长廊的方案数。
2025-12-14 19:30:20
188
原创 leetcode 3433(排序+模拟)
按照时间戳 timestamp 从小到大排序,时间戳相同的,离线事件排在前面,因为题目要求「注意输入的 events 不保证是按时间顺序发生的,需要先排序。在所有相同时间发生的消息事件之前处理」。3433: 统计用户被提及情况。
2025-12-12 15:10:57
172
原创 leetcode 3531
对于每个建筑 (x,y),如果 x 在这一行的最小值和最大值之间(不能相等),y 在这一列的最小值和最大值之间(不能相等),那么答案加一。如果一个点不在同一行的最左边也不在最右边,那么这个点左右都有点;如果一个点不在同一列的最上边也不在最下边,那么这个点上下都有点。记录同一行的最小横坐标和最大横坐标,同一列的最小纵坐标和最大纵坐标。3531: 统计被覆盖的建筑。
2025-12-11 22:43:44
218
原创 leetcode 3577
根据定理,如果计算机 0 右边的所有计算机的密码复杂度都比 complexity[0] 大,那么我们可以按照任意顺序解锁这 n−1 台计算机,方案数为 n−1 个不同。用计算机 j 解锁计算机 i 的前提是 j<i 且 complexity[j]<complexity[i]。:当且仅当计算机 0 右边的所有计算机的密码复杂度都比 complexity[0] 大,才能解锁所有计算机。3577: 统计计算机解锁顺序排列数。
2025-12-10 22:20:54
256
原创 leetcode 3583(三变量问题,枚举中间的变量)
由于答案不超过 n⋅10^5⋅10^5≤10^15,可以只在返回时取模。3583: 统计特殊三元组。
2025-12-09 21:34:39
215
原创 leetcode 1925(枚举)
我们可以枚举所有 a>b 的平方和三元组 (a,b,c)。由于 a^2+b^2=b^2+a^2,所以 (b,a,c) 也是平方和三元组。所以只需统计 a>b 的情况,最后把统计结果乘以 2,即为答案。是整数,那么我们找到了一个平方和三元组 (a,b,c),计数器加一。枚举 a,b,如果 a^2+b^2 ≤n*n (c<=n) 且 c=1925: 统计平方和三元组的数目。(向 0 取整,不是四舍五入),这是“隐式类型转换”,
2025-12-08 21:45:21
159
原创 leetcode 3578(单调队列+动态规划)
的连续子段]枚举最后一个子数组的左端点 j,那么问题变成前缀 nums[0] 到 nums[j−1] 在题目约束下的分割方案数,即 f[j]。动态规划:我们设 dp[i+1] 表示以 i 为结尾的前缀子数组 nums[0⋯i] 满足题目要求的分割方案数,单调队列是一种特殊的队列数据结构,它维护队列中的元素具有单调性(单调递增或单调递减)。nums[0] 到 nums[i] 在题目约束下,分割出的最少(最多)子数组个数,本题是定义成。,由于子数组越长,最大值越大,最小值越小,最大最小的差值越可能大于 k。
2025-12-06 18:46:56
235
原创 leetcode 3432
题目要求 L−(S−L)=2L−S 是偶数。设 nums 的元素和为 S,左子数组元素和为 L,那么右子数组的元素和为 S−L。3432: 统计元素和差值为偶数的分区方案。上述结论与 i 无关。
2025-12-05 19:27:04
164
原创 leetcode 2211
碰撞发生后,涉及的车辆状态变为'S';首先排除不可能发生碰撞的车:最左侧向左、最右侧向右。2.状态为'L'or'R'的车与'S'车相撞 +1(非S车辆数目为1)1.两辆方向相反的车相撞 +2(非S车辆数目为2)2211: 统计道路上的碰撞次数。->统计有多少非 S 的车即可。区间内都会被“卡住”;
2025-12-04 13:19:50
195
原创 leetcode 3625
int 一般认为是32bit,高16位为横坐标,低16位为纵坐标->把二维坐标压缩成一个 int。dy/dx 强制整个表达式按 double 精度计算,防止“整数除法”把结果截断成整数。在 C/C++ ,0 被视为 false,非 0 被视为 true。能表示的最大有限值(≈1.79769e+308)若 dx = 0(垂直),把 k 标记成。(一个不可能与任何正常斜率冲突的特大数)3625: 统计梯形的数目Ⅱ。我们用的是顶边和底边,
2025-12-03 23:45:57
278
原创 leetcode 3623(组合数)
根据乘法原理,之前遍历过的行与这一行,一共可以组成s⋅k 个水平梯形,加入答案。枚举每一行,设这一行有 k= c*(c-1)/2 条水平边,那么另外一条边就是。,有c*(c-1)/2种选法,可以组成一条水平边,即梯形的顶边或底边。首先,统计每一行的点的个数,如果这一行有 c 个点,那么。思路:组合数C(n,k) (即“n 选 k”)3623: 统计梯形的数目Ⅰ。从这 c 个点中选 2 个点。
2025-12-02 21:25:31
206
原创 leetcode 2141(二分查找)
1.假设可以让 n 台电脑同时运行 x 分钟,那么对于电量大于 x 的电池,其只能被使用 x 分钟,因此每个电池的使用时间至多为 min(batteries[i],x)。那么要让 n 台电脑同时运行 x 分钟,如果可以运行 k 分钟,那么也一定可以运行 k−1,k−2,⋯ 分钟。因此一定存在一个 k′,使得我们可以运行 ≤k′分钟,但不能运行 >k′分钟,此时 k′就是我们需要求出的答案。2.当 总的可供电时间>=mid*n,代表当前mid可行。思路:运行时间k是有范围限制的,因此可以考虑。
2025-12-01 23:15:22
305
原创 leetcode 1590(子数组和问题,前缀和)
如果 last 中包含 (s[i]modp−xmodp+p)modp,设其对应的下标为 j,那么 [j,i) 是一个符合题目要求的子数组,用其长度 i−j 更新答案的最小值。思路:设 nums 的元素和为 x,去掉的子数组和为 y。x−y 能被 p 整除,根据前置知识中。INT_MAX约为(2.1 × 10^9),数组所有元素求和,mod p可以表示为int。遍历 s[i] 的同时,用哈希表 last。记录 s[i]modp 最近一次出现的下标。的定义,这等价于 y≡x(modp);
2025-11-30 14:12:04
154
原创 leetcode 2872
如果其中一个连通块的点权和不是 k 的倍数,那么这个连通块无论如何分割,始终存在一个点权和不是 k 的倍数的连通块。由于题目保证整棵树的点权和是 k 的倍数,所以只需看其中一个连通块的点权和是否为 k 的倍数。计算子树 x 的点权和 s,如果 s 是 k 的倍数,那么可以删除 x 到其父节点这条边。注意根节点没有父节点。删除后,由于分割出的连通块点权和仍然是 k 的倍数,所以可以继续分割,直到无法分割为止。不是 k 的倍数的数,继续拆分,始终存在一个不是 k 的倍数的数。连通块的数目等于删除的边数加一。
2025-11-28 23:58:41
262
原创 leetcode 3381(子数组和问题,前缀和)
假设先不考虑长度被 k 整除,直接求最大和非空子数组,有一种使用前缀和的解法:枚举子数组的右端点,那么最佳左端点就是之前出现过的前缀和最小的位置。由于 −1 与 k−1 模 k 同余,所以初始化 minS[k−1]=0。加入长度被 k 整除的条件,思路也是一样的,只不过额外限制了左右端点的下标 modk 的值需要相同。问题相当于:计算最大的 s[j]−s[i],满足 i<j 且 j−i 是 k 的倍数。子数组 [i,j) 的元素和为 s[j]−s[i],长度为 j−i。在 C/C++ 里属于。
2025-11-27 18:18:36
196
原创 leetcode 2435(动态规划——从记忆化搜索到递推)
注:如果不写 f[0][1]=1,那么需要在代码中特判 i=j=0 的情况,因为 f[1][1] 属于初始值,不能用状态转移方程计算。但是,如果把初始值改成 f[0][1]=1(或者 f[1][0]=1),就无需特判 i=j=0 的情况了,f[1][1] 也可以用状态转移方程计算。递归入口:题目求从起点 (0,0) 走到 (m−1,n−1),且路径和模 k 为 0 的路径数,即dfs(m−1,n−1,0)递归边界:dfs(−1,j,s)=dfs(i,−1,s)=0 无法从 (0,0) 到达这些位置。
2025-11-26 23:31:12
420
原创 leetcode 1018
比如 nums=[1,1,0,1],每个前缀对应的二进制数分别为 1,11,110,1101。在十进制中,我们往 12 的右边添加 3,得到 123,做法是 12⋅10+3=123。对于二进制,做法类似,往 110 的右边添加 1,得到 1101,做法是 110⋅2+1=1101,或者 110 << 1 ∣ 1=1101。注意本题 nums 很长,算出的二进制数 x 很大,但我们只需要判断 xmod5=0 是否成立。可以在中途取模,也就是每次循环计算出新的 x 后,把 x 替换成 xmod5。
2025-11-25 00:06:46
244
原创 leetcode 1262(dp动态规划)
初始值 f[0]=[0,−∞,−∞],翻译自 dfs(−1,0)=0,dfs(−1,1)=−∞,dfs(−1,2)=−∞。注意,如果 (j−x)mod3<0,需要再 +3 调整到 [0,2] 内。定义 dfs(i,j) 表示从 nums[0] 到 nums[i] 中选数,(注意这里的定义是已经选的,上面定义的是还需要选的。的数字之和 s 满足 smod3=j 的前提下,s 的最大值。答案为 f[n][0],翻译自 dfs(n−1,0)。思路:dp动态规划(选or不选)递归入口:dfs(n−1,0)。
2025-11-24 14:44:53
242
原创 leetcode 3190
由此可见,对于不是 3 的倍数的元素,只需操作一次就可以变成 3 的倍数,所以答案为不是 3 的倍数的元素个数。3190: 使所有元素都可以被3整除的最少操作数。思路1:取余数,3和余数的差值 两者的较小值。
2025-11-22 15:32:06
173
原创 leetcode 1930
1930: 长度为3的不同回文子序列。元素已存在 → 直接忽略,返回。单元,全部初始化为 -1。元素不存在 → 插入,返回。一次性开出 26 个。
2025-11-21 23:55:55
198
原创 leetcode 2154
返回不在 nums 中的最小的 original*2^k,其中 k 是非负整数。哈希集合记录的元素可以更少,只需要记录符合 original*2^k 的元素。2154: 将找到的值乘以2。思路2:只记录所有可能值。
2025-11-19 20:44:57
148
原创 leetcode 717
分类讨论:如果最后剩下一个数字,由于题目保证 bits[n−1]=0,返回 true。如果最后没有剩下数字,说明字符串的最后一个字符不是1比特字符,返回 false。思路:两种字符的第一个数字是不同的,一个是 0,另一个是 1。717: 1比特与2比特字符。
2025-11-18 21:25:38
108
原创 leetcode 1437
int k) 中nums是一个数组,所以用if(nums[i]==1);) 中s是一个字符串,所以用if (s[j] ==1437: 是否所有1都至少相隔k个元素。之前的题目int numSub(思路:记录所有1的下标。
2025-11-17 20:01:43
276
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅