Leetcode每天一题
文章平均质量分 79
记录每天一题中有趣、有启示的题目
诶咦
这个作者很懒,什么都没留下…
展开
-
LeetCode 1921. 消灭怪物最大数量(贪心 + 排序)
那么这道题很见到存在最优子结构,如果我们在最短时间内消灭的最大怪物数量为n,且第 i 只怪物抵达时间分别为times[i]中,我们会发现优先消灭 min{times[i]} 的怪物最好。决策的包容性意味着:我们在 cur_time ~ cur_time + 1 的时间内,我们将击杀怪物数从 n -> n + 1,我们可以击杀任何一只怪物,但是我们击杀怪物后剩余的容错时间有所不一样。如果存在,优先考虑贪心!从长久积累的经验来说,我们应该尽快消灭最早抵达城市的怪物,这样子我们才能够尽可能多的消灭怪兽。原创 2023-09-03 22:47:09 · 163 阅读 · 0 评论 -
Leetcode 2337. 移动片段获得字符串
这里我们知道一个点。以示例1为例子,我们知道应该是“R”字符应该是按照顺序匹配的。但是,我们率先扫描到是左边的“R”。而在移动中间的字符时,我们“R”是收到影响的。基于此,如果我们提出非占位符“_”后,两个字符串序列应该一致。但是,"_"的位置对于我们的答案有所影响,所以我们不能真正的完全无视它。关注到“L”的匹配优先匹配左边,“R”的匹配优先匹配右边。根据题目“L”只能向左移动,“R”只能向右移动。值得注意的是“L”和“R”为占位符,即不可互穿过。为了方便说明,我们将start中的R做出标记以示区别。原创 2023-08-21 01:45:59 · 125 阅读 · 0 评论 -
Leetcode. 3n 块披萨
如果 [1, i-1] 范围的PIZZA 不选去那么就代表的是在 [i, r] 区间内选 k 个PIZZA。首先,面对我们环形结构的第一个策略就是无视防御,先思考它为链形结构的状态。也就是我们的目标是覆盖区间 [1, N], 而我们每一次的状态是[l, r]。在状态的择取上,我们往往选择最小的覆盖集合。我们发现我们只关注从[1, r]的区间,所以我们可以固定l = 1。这很容易理解,如果第 r 块PIZZA不选去,那么 dp[l][r][k-1] 就是 dp[l][r-1][k-1]。原创 2023-08-18 15:20:20 · 146 阅读 · 0 评论 -
区间DP讲义
所以,我们可以给出 动规数组 d[i][j][k]表示将 [i, j] 分成 k 段的代价。原创 2023-08-10 15:32:23 · 207 阅读 · 0 评论 -
Leetcode 1289.下降路径最小和II
基于此,我们可以撤销遍历k的循环,从而使用 first_sum,first_pos,second_sum来代替。注意第2小的位置我们无需关心,因为一定不会跟第1小的位置相同。至此我们发现,我们需要一层循环遍历 j,一层循环遍历 k,还需要一次循环遍历 i。接下来,我们经行优化。在遍历寻找的最小位置的时候,我们发现:如果第 i-1 行的最小值位置为 pos,接下来,因为我们的起点是不固定的,而终点是固定可知的。所以,我们的解决算法关注到 “动态规划”。因为我们需要返回最小路径和,那么我们的。原创 2023-08-10 09:43:20 · 150 阅读 · 0 评论 -
Leetcode 1749. 任意子数组和的最大绝对值
那么我们为了保证连续区间的特点需要对跨区情况需要花费O(n)的时间去维护最大绝对值。最后我们只需要访问整个区间即可,也就是最后复杂度会来到O(nlogn)。当然,如果你是采用记忆化搜索的,时间复杂度可以来到O(n)。本质上来讲,树状数据也是一种前缀和数组且是线段树的优化。关键在于最大绝对值的维护,我们的第一个想法就是某一段区间内的和最大或者最小。但从关键字 “区间” 而言,我们有 前缀和数组、树状数组、 线段树以及区间动规。) ,面对 题目的数据量这样的代价是高昂的。所以,我们需要另寻他法。原创 2023-08-08 10:32:03 · 255 阅读 · 0 评论 -
经典题:编辑距离
通过上述的分析,我们也得知了如果要获取 dp[i][j] 则需要知道 dp[i-1][j], dp[i][j-1], dp[i-1][j-1] 三个状态值。从各大OJ平台对其的收录,我们可以知道这道题是多么的经典。首先,删除操作跟插入操作一样,是可以在任何情况执行的。注:#表示空字符串,2表示我们在计算的,1表示我们需要获取的。的最小操作次数,而这是我们可以知道的。原创 2023-08-05 09:58:11 · 246 阅读 · 0 评论 -
Leetcode 980.不同路径III
你想得没错,这道题leetcode的数据不是很强...在 0原创 2023-08-04 12:03:39 · 105 阅读 · 0 评论 -
LCR 051.二叉树中最大路径和
根据题目意思,一条路径序列中的节点仅出现一次也就表明这条路线是单一的,不会出现交汇的情况。那么我们不妨考虑简单情况,因为此时我们面对处理树的手段还有DFS。我们可以通过DFS来缩小问题规模。这道题是一道路径规划题。如果,我们将其视作图。从枚举的角度上来说 弗洛伊德算法 将是很好的一种解决手段。但是,我们的树中节点的规模告诉我们,这是痴心妄想的。3. 链接左右子树,也意味着路径规划结束,不可能在上传。最终的答案,就在这三种情况中诞生。1. 向左子树延申,可上传。2. 向右子树延申,可上传。原创 2023-08-03 18:56:47 · 155 阅读 · 0 评论 -
leetcode--2681.英雄的力量解析
同理,蓝色组 = (绿色组_min_sum + 黄色组_min_sum + 4)* 16 = (3 + 1 + 4)* 16 = 128;我们知道 [1, 2, 4] 的答案与 [2, 1, 4] 是等价的,因为它们的子序列是完全一致的。同时 [1, 2, 4] 也跟方面我们的表达式计算,因为我们花费更小的力气去寻找最大最小值。那么 preSum[i + 1] = preSum[i] + dp[i];第七组:[1, 2, 4] = 16;第六组:[2, 4] = 32;第三组:[1, 2] = 4;原创 2023-08-03 16:35:46 · 156 阅读 · 0 评论 -
leetcode--882.反转卡片游戏
表示前 i 张卡片的最小背面值。当我们加入第 i + 1 张卡片时,我们不妨先观察会产生几种结果,并分析产生条件。因为计算机的离散化处理方式,且具体到题目,本道题是最优化过程。所以我们可以尝试使用动态规划的思路。即寻找最优子结构来解题。基于这个事实,我们可以分析出,如果第 i + 1 张无论是正反面的值。基于这个分析,我们就可以免除记录前面牌面的状态记录。我们可以看到对于上面三个结果以及条件中,我们其实。因为对于其他结果翻转是不需要的/无用的。小,那么它在次之前不可能出现。根据题目意思,我们可以得知。原创 2023-08-03 15:53:58 · 156 阅读 · 0 评论 -
leetcode--772.删除注释
正是因为这种 “先进先出” 的关系,导致只要不出现这种匹配关系,那么字符就不会被抛弃,意味着该字符最终会被先行输入输出数组中。但是还需要几个细节需要处理,如果我们遇见了 "/*" , 那么这种情况是可以跨行存在的。如果栈的大小不为0,就说明还有 "/*" 没被中和,所以不输出的状态应该被保持。所以,在思考这道题的时候,我采用“栈”的思路。但是,有所不同的是每一行代码后面自带 "\n" ,所以我们应该是遇到 "//" 就执行抛出操作。遇到 ‘*’ 也是相同的,我们无法判断它的操作含义,它可能是。原创 2023-08-03 08:26:46 · 197 阅读 · 0 评论 -
过桥的时间(leetcode -- 2532)
通过leetcode--2532加深计算机对并行,状态纠缠的处理方式/方案。原创 2023-07-07 17:34:29 · 151 阅读 · 1 评论 -
满足不等式的最大值
根据问题简化示意图,如果要枚举,那么我们要枚举各个区间的左端点,再者确定区间范围。每一层的复杂度大致在O(n),所以最后的枚举算法复杂度在O(n^2)。其中0原创 2023-07-21 18:45:25 · 243 阅读 · 1 评论 -
leetcode--918:环形子数组最大和
那么我们要处理的跨界情况值就是nums[0: i] + nums[j: n]。而我们的跨界最大值为。但是,在链表区间上,我们想要枚举清楚,就必要将循环链表断成n条单向链表(数组);所以我们只需要在nums[0]为首元素的时候,记录不跨界最大值,和不跨界最小值就可以了以及总值。所以我们可以设计状态数组dp[n] 表示从["左端点", i]区间中最大的序列和。ps:每一次的状态转移关系是,固定区间左端点(一个端点)后,状态改变是简单的。再次看到这道题目,我们发现如果在求和操作中,每一次的状态转移关系是简单的。原创 2023-07-20 04:18:54 · 465 阅读 · 1 评论 -
Leetcode--2569. 更新数组后求和查询(浅谈对线段树相关理解)
讲解完我们的前置知识,我们先来浅谈一下线段树和树状数组。树状数组擅长处理前缀,而线段树擅长处理区间。而值得一提的是,我们可以使用presum[i] - presum[j]来求取[i, j]的区间和。所以,在一般情况下树状数组也擅长处理区间。那么,我们不禁发问!树状数组就一定何时何地都比线段树优秀吗?答案是否定的,树状数组的优秀有一个前提条件:对一个值进行更迭。但是,如果我们需要对区间内的多个值进行更迭。那么树状数组就需要一个个的遍历更新,而每次更新需要O(logN)的时间。原创 2023-07-26 04:21:41 · 104 阅读 · 1 评论