
leetcode每日一题
文章平均质量分 61
记录leetcode每日一题题解
_Equinox
分享学习过程
展开
-
前缀和优化dp,LeetCode 3193. 统计逆序对的数目
f[i][j] = f[i][j - cnt[i - 1]], 如果 cnt[i - 1] <= j <= min(i + cnt[i - 1], ed)如果 cnt[i - 1] = -1,那么当前位置填的数字和左边的逆序对贡献只要不超过 ed 即可。定义状态 f(i, j) 为 考虑到 下标 i 为止,我们构成 j 个逆序对的方案数。也就是说 我们在最右端填一个数字x,就能得到左边有几个数字和x构成逆序对。因为是一个排列,所以我们不关注具体的数字,只关注所填数字的rank。表示这个要求中的末尾下标和。原创 2024-10-17 23:18:28 · 869 阅读 · 0 评论 -
二维dp,LeetCode 887. 鸡蛋掉落
那么 f(i, j) = f(i - 1, j - 1) + f(i - 1, j) + 1,在实现的时候可以滚动数组优化掉一个维度。考虑定义状态 f(i, j) 为 剩余 i 次 扔鸡蛋机会,当前有 j 枚鸡蛋 能够 测得的最大楼层。如果鸡蛋没碎,那么 我们可以从 1 + f(i - 1, j) 往上测,测得的有效层数+1。如果鸡蛋碎了,那么 我们只能在 [1, f(i - 1, j - 1)] 之间 测。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层。的楼层落下的鸡蛋都会碎,从。原创 2024-10-14 16:07:12 · 370 阅读 · 0 评论 -
线段树二分,LeetCode 2286. 以组为单位订音乐会的门票
由于填满的格子不会再次在 scatter中访问,所以是 O((n + q)logn) 的。时间复杂度: O((N + Q)logN)空间复杂度:O(NlogN)对于scatter 我们线段树二分找到第一个不空的,依次往后填。对于gather 相当于找从上往下第一个剩余空间够k的排。对于scatter 相当于找从上往下依次填k个空格。对于gather我们线段树二分找到第一个符合的即可。我们用线段树来维护 区间剩余容量以及区间容量最值。原创 2024-09-28 23:35:02 · 569 阅读 · 0 评论 -
枚举+组合数学,LeetCode 2306. 公司命名
我们可以将字符串按照后缀分组,遍历字符串数组,计算每个后缀的重叠 pair(i, j) 数目即可。时间复杂度: O(n(m + U))空间复杂度:O(U^2 + nm)答案是 cnt[i] * cnt[j] 其中 j < i 吗?表示在公司命名过程中使用的名字列表。对于不同的i, j,却有着相同的 s[1::]考虑每个首字符出现次数 cnt[]且有效的公司名字的数目。原创 2024-09-25 13:43:26 · 415 阅读 · 0 评论 -
数位dp,LeetCode 2376 统计特殊整数
数位dp如何递推求解?原创 2024-09-20 10:23:35 · 650 阅读 · 0 评论 -
模拟+分类讨论,LeetCode 2332. 坐上公交的最晚时间
结束后,如果最后一个车没满,那么从最后一个车的发车时间往前倒推,找到一个空闲时间点。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。遍历每个车,维护一个乘客指针,只要当前乘客能上车就后移。否则,从最后一个上车的乘客往前倒推,找到一个空闲时间点。每位乘客都会搭乘下一辆有座位的公交车。返回你可以搭乘公交车的最晚到达公交站时间。且公交没有满,那么你可以搭乘这一辆公交。随着来的乘客越来越晚,其能登上的车也就越靠后。辆公交车的出发时间。跟别的乘客同时刻到达。将车 和 乘客都升序排序。到达的乘客优先上车。原创 2024-09-18 15:47:33 · 548 阅读 · 1 评论 -
单调队列,LeetCode 2398. 预算内的最多机器人数目
那么过程中当 花费 > budget,往右收缩 j 同时根据 j 来弹出队头。维护一个单调队列,队头到队尾chargeTime单调递减,即队头最大。固定右端点r,r右移其合法左端点l不会后退,具有单调性,考虑滑窗。时间复杂度: O(N)空间复杂度:O(N)i 代表窗口右端点,j 代表窗口左端点。维护i - j + 1的最大值即可。由于要获取滑窗最值,考虑单调队列。个机器人,给你两个下标从。个机器人中最大充电时间,个机器人的运行时间之和。运行的机器人数目为多少。原创 2024-09-13 15:36:42 · 674 阅读 · 0 评论 -
贪心+滑窗+递推,LeetCode 2555. 两个线段获得的最多奖品
我们考虑滑窗维护当前线段[i, j],在过程中维护答案 res = max(res, j - i + 1 + pre[i])不会,我们总能将两个相交线段分开来得到更优解。pre[i] 指 [0, i) 内的最长线段。时间复杂度: O(N)空间复杂度:O(N)pre[] 可以在滑窗 的过程中递推。考虑最优解的两个线段会相交吗?原创 2024-09-11 16:19:44 · 301 阅读 · 0 评论 -
枚举,LeetCode 2552. 统计上升四元组
cnt3[j] += cnt2,因为cnt2 为 (i, k) 的数目,i < j,k = l > i 故合法。我们考虑 枚举 l,维护cnt3[],即 [0, l) 内 (i, j, k) 的数目。在内层枚举 j,维护cnt2,即[0, j] 内 (i, k) 的数目。则 cnt4 += cnt3[j],cnt2 += 1。可以用递推预处理前后缀,但是枚举的方式更训练思维。时间复杂度: O(N^2)空间复杂度:O(N)的所有数字,请你返回上升四元组的数目。如果nums[j] < nums[k]原创 2024-09-10 21:06:28 · 476 阅读 · 0 评论 -
前缀和优化DP,LeetCode 3177. 求出最长好子序列 II
ma(j) 可能会包含 f(x, j - 1),但是由于 f(x, j) >= f(x, j - 1),所以f(x, j) + 1 >= f(x, j - 1) + 1,不影响状态转移的正确性。那么 f(i, j) = max(f(i, j), ma(j)) + 1。f(x, j) 为 以x结尾有 j 个 坏pair 的最大好序列长度。时间复杂度: O(NK)空间复杂度:O(NK)每次从当前列或者左边列转移,我们考虑前缀优化。ma[j + 1] 代表 第 j 列最大值。,那么我们称这个整数序列为。原创 2024-09-06 17:35:47 · 532 阅读 · 0 评论 -
思维+排序,LeetCode 2860. 让所有学生保持开心的分组方法数
是班级中学生的总数。我们此时一个学生一旦选择,因为前面的都比他小所以前面的都要选。返回能够满足让所有学生保持开心的分组方法的数目。时间复杂度: O(N)空间复杂度:O(N)如果能够满足下述两个条件之一,则认为第。由于值域在n以内,可以用计数排序代替快排。能选的前提就是后面挨着那个比他大。原创 2024-09-04 21:37:40 · 476 阅读 · 2 评论 -
滑动窗口,LeetCode 2024. 考试的最大困扰度
(也就是连续出现 true 或者连续出现 false)。那么我们维护一个变长滑窗,保证滑窗内 T 或 F的个数小于等于k。老师想增加学生对自己做出答案的不确定性,方法是。道判断题构成的考试,每道题的答案为 true (用。除此以外,还给你一个整数。时间复杂度: O(N)空间复杂度:O(N)只要窗口内的T或F的个数小于等于k即可。表示)或者 false (用。考虑一个窗口是否可以变为连续?一位老师正在出一场由。滑窗的最大长度就是答案。原创 2024-09-02 16:29:00 · 333 阅读 · 0 评论 -
试填法,LeetCode 3145. 大数组元素的乘积
容易写挂原创 2024-08-23 15:16:27 · 555 阅读 · 0 评论 -
二分+位运算,LeetCode 3007. 价值和小于等于 K 的最大数字
如果x >> i为奇数,那么有 (x >> i) / 2 * 2 + (x & ((1 << i )- 1)) + 1。和我们考虑第0位一样,就相当于向右移i位后,看第0位的1的个数,然后低i位有1 << i种情况,累计贡献。对于x >> i奇数的情况其实就是x 在第 i 位为1,然后此时低i位的选择取决于x的低i位。给定x,[1, x]内有多少数字第0位为1?如果x >> i为偶数,那么有 (x >> i) / 2 * 2。[1, x]内有多少数字第i位为1?的价值是它的二进制表示中在。原创 2024-08-21 17:56:11 · 456 阅读 · 0 评论 -
矩阵快速幂优化状态机dp,LeetCode 552. 学生出勤记录 II
借着这题迭代下板子原创 2024-08-19 22:30:04 · 433 阅读 · 0 评论 -
单调队列优化dp+位运算,LeetCode 3117. 划分数组得到最小的值之和
元素。你需要将。原创 2024-08-16 12:26:39 · 447 阅读 · 0 评论 -
离线处理查询,LeetCode 2940. 找到 Alice 和 Bob 可以相遇的建筑
但是这种直接借助数据结构的方式不利于思维的训练,这种题目往往可以使用离线处理 + 数据结构维护,往难了出可以主席树,整体二分,莫队……我们可以倒序遍历heights,维护一个单调栈,栈顶到栈底递增,那么遍历过程中,如果有询问,栈顶到栈底第一个大于的就是答案。查询(a, b)(a <= b),如果 height[a] < height[b] 或者a == b,那么答案就是b。将查询放到右端点b处,记保存每个下标作为右端点的查询,即 找到b右边大于height[a] 的最靠近b的索引。Bob 不能相遇,令。原创 2024-08-10 12:28:33 · 670 阅读 · 0 评论 -
dp+容斥原理,LeetCode 3130. 找出所有稳定的二进制数组 II
不会纯数学的方式,好菜原创 2024-08-06 18:00:57 · 404 阅读 · 1 评论 -
01背包+枚举,
选:f(i, j) += f(last[i], j - 1),last[i] 为 nums[i] - nums[k] >= d中最靠右的k,这个可以O(NlogN)预处理。事实上我们这样计算即可:res += (d - prev) * f[n][k],prev为上一个枚举的差值。定义状态 f(d, i, j) 前 i 个数,拿了 j 个数 , 最小差值 >= d的能量和。然后由于我们定义状态是 >= d的能量和,我们不知道其中有多少=d的。不选:f(i, j) = f(i - 1, j)原创 2024-07-23 13:48:37 · 429 阅读 · 0 评论 -
费用流,LeetCode 2850. 将石头分散到网格图的最少移动次数
LC原来有网络流的题啊原创 2024-07-20 15:22:23 · 313 阅读 · 0 评论 -
最短路,LeetCode 3112. 访问消失节点的最少时间
从图中消失的时间点,在那一刻及以后,你无法再访问这个节点。,图有可能一开始是不连通的,两个节点之间也可能有多条边。时间复杂度: O(NlogN)空间复杂度:O(N)在松弛操作那里加一个disappear的判断即可。就是dijkstra板子题。单位时间通过的无向边。原创 2024-07-18 12:39:14 · 442 阅读 · 0 评论 -
并查集,LeetCode 721. 账户合并
现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于同一个人。请注意,即使两个账户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称。一个人最初可以拥有任意数量的账户,但其所有账户都具有相同的名称。由于有相同邮箱的账户是同一个人的账户,于是我们可以按照邮箱将每个账户编号合并,这可以用并查集来实现,然后把一个连通块的邮箱汇总排序即可。合并账户后,按以下格式返回账户:每个账户的第一个元素是名称,其余元素是。时间复杂度: O(NlogN)空间复杂度:O(NlogN)原创 2024-07-15 13:55:14 · 477 阅读 · 1 评论 -
双指针,LeetCode 2972. 统计移除递增子数组的数目 II
对于每个j(满足num[j, ..., n - 1]递增),我们可以指针后移或者二分得到最靠右的nums[i],其中nums[i] < nums[j],那么含后缀nums[j, ..., n - 1]的答案数目取决于我们保留前缀的数目,显然是i +2。否则,我们考虑最长递增前缀的末尾下标为i,那么只保留前缀的结果有i + 2个(注意可以为空)对于本身就是递增数组的数组,答案就是(n + 1) * n / 2,直接特判。考虑我们要的递增数组是一个前缀一个后缀拼接的,且前缀后缀可以为空。原创 2024-07-10 13:28:09 · 587 阅读 · 0 评论 -
数学,LeetCode 3102. 最小化曼哈顿距离
如何高效求最大曼哈顿距离?原创 2024-07-09 16:50:36 · 517 阅读 · 0 评论 -
中位数贪心,3086. 拾起 K 个 1 需要的最少行动次数
扫描一遍k - maxChanges的窗口,O(1)计算其中位数贪心下的解维护最优解即可。3个以内的连续1的最大连续长度记为c,如果拿掉c个剩下的1可以都通过2步得到。Alice 在玩一个游戏,游戏的目标是让 Alice 使用。如果1、2、3个连续个1,我们发现此时分别需要0、1、2步。我们的答案就是c - 1 + (k - c) * 2。否则,问题就变成了一个很简单的中位数贪心问题。,Alice 会拾起一个 1 ,并且。操作1其实就是提供了一种两步得到1的方案。我们考虑两步一个1一定是最优的吗?原创 2024-07-04 16:43:48 · 465 阅读 · 0 评论 -
差分,LeetCode 2779. 数组的最大美丽值
定义是:经由原数组删除一些元素(也可能不删除)得到的一个新数组,且在此过程中剩余元素的顺序不发生改变。时间复杂度: O(max(nums) + n)空间复杂度:O(max(nums))我们可以用线段树或者树状数组,不过显然,差分数组是更好的选择。遍历原数组,每次对[k - x, x + k]进行+1操作。维护完差分数组后,我们对差分数组求一遍前缀和取最大值即可。定义为数组中由相等元素组成的最长子序列的长度。我们可以用数组来记录区间内每个数字的被覆盖次数。执行上述操作任意次后,返回数组可能取得的。原创 2024-06-15 16:19:36 · 597 阅读 · 0 评论 -
LeetCode 2786. 访问数组中的位置使分数最大
而我们每次无非就是从前面某个奇数结尾或者偶数结尾转移。那我们不妨只记录奇偶结尾的最大收益,然后进行转移即可。我们并不关注前面状态具体的值,我们只关注奇偶性。时间复杂度: O(N)空间复杂度:O(1)f[i]为前i元素以i结尾的最大收益。但是我们发现我们状态转移和奇偶性有关。不难写出O(N^2)的朴素dp。这样状态转移就变成了O(1)的。原创 2024-06-14 23:24:54 · 437 阅读 · 0 评论 -
反悔贪心,LeetCode 2813. 子序列最大优雅度
经典的堆式反悔贪心原创 2024-06-13 14:40:57 · 461 阅读 · 0 评论 -
一次遍历,419. 甲板上的战舰
两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。表示甲板,其中,每个单元格可以是一艘战舰。时间复杂度: O(NM)空间复杂度:O(1)换句话说,战舰只能按。只能水平或者垂直放置在。列)的形状建造,其中。原创 2024-06-11 09:12:14 · 183 阅读 · 0 评论 -
树状数组+离散化,LeetCode 3072. 将元素分配到两个数组中 II
我们只需要能够实现快速查询arr1和arr2内大于给定数字的数字个数即可。Python可以直接使用有序列表SortedList。时间复杂度: O(NlogN) 空间复杂度:O(N)考虑线段树、树状数组、莫队……的所有元素分配到两个数组。在第一次操作中,将。这里使用两个树状数组维护。原创 2024-06-05 14:22:43 · 333 阅读 · 0 评论 -
分类讨论,2981. 找出出现至少三次的最长特殊子字符串 I
如果a[0] == a[1],那么可以从二者中拆出来三个a[0] -1。如果a[0] > a[1],那么可以从二者中拆出来三个a[1] - 1。如果a[0] > 2,那么可以从a[0]中拆出来3个a[0] - 2。当然可以从a[0], a[1], a[2]中拆出三个a[2]的长度,如果不存在出现至少三次的特殊子字符串,则返回。时间复杂度: O(nlogn)空间复杂度:O(nU)如果一个字符串仅由单一字符组成,那么它被称为。不是特殊字符串,而字符串。是字符串中的一个连续。原创 2024-05-29 23:30:19 · 312 阅读 · 0 评论 -
数学加构造,LeetCode 2028. 找出缺失的观测数据
简单的构造题原创 2024-05-27 10:33:16 · 508 阅读 · 0 评论 -
二维前缀异或和,1738. 找出第 K 大的异或坐标值
时间复杂度: O(mnlog(mn))空间复杂度:O(mnlog(mn))计算二维前缀异或和,然后把所有值排序,取第k大即可。原创 2024-05-26 09:10:08 · 263 阅读 · 0 评论 -
两种做法单调栈/线段树,LeetCode 1673. 找出最具竞争力的子序列
两种方法都挺好的原创 2024-05-24 16:10:28 · 291 阅读 · 0 评论 -
思维+滑动窗口,LeetCode 2831. 找出最长等值子数组
那就变成了在每个元素的下标数组中跑滑动窗口,双指针l,r满足id[r] - id[l] - (r - l) <= k,即元素出现的左右边界长度减去元素个数不能超过k。或者我们可以将每个元素出现下标存到数组里,然后在每个元素的下标数组中找最长连续子序列。如果没有最多删除k这个选项,我们在数组中找最长等值数组,双指针遍历一遍即可。如果子数组中所有元素都相等,则认为子数组是一个。个元素后,返回可能的最长等值子数组的长度。时间复杂度:O(N) 空间复杂度:O(N)是数组中一个连续且可能为空的元素序列。原创 2024-05-23 11:41:25 · 545 阅读 · 0 评论 -
哈希加排序,LeetCode 2225. 找出输掉零场或一场比赛的玩家
水水水原创 2024-05-22 14:53:38 · 245 阅读 · 0 评论 -
前缀和+位运算,LeetCode 1542. 找出最长的超赞子字符串
联想回文串特点结合按位拆分原创 2024-05-20 19:33:53 · 454 阅读 · 0 评论 -
一次遍历,LeetCode 1535. 找出数组游戏的赢家
一次遍历原创 2024-05-19 09:36:18 · 360 阅读 · 0 评论 -
经典贪心,826. 安排工作以达到最大收益
很经典的一道板子题原创 2024-05-17 08:55:26 · 339 阅读 · 0 评论 -
区间选点问题,LeetCode 2589. 完成所有任务的最少时间
区间贪心经典问题原创 2024-05-15 18:02:34 · 503 阅读 · 0 评论