自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(120)
  • 收藏
  • 关注

原创 字符串哈希模版(来自TsReaper)

有一个字符串word,让你求出某一段所对应的数值(即映射值),word[L,R]对应的数值。

2024-02-05 19:20:17 359

原创 字符串匹配算法(z函数模版)来自灵神。

一个字符串s求出s的z[i],z[i]表示以s[i:n]这一段和s[0:n]的从前往后的连续相等字母个数。比如 abacaba,z[2] = (acaba与abacaba比较) = 1。

2024-02-05 17:31:40 259

原创 leetcode第365场周赛

这里就需要根据target的大小进行分类讨论了,结论:如果target的和小于nums的和s,那么只需要两个nums排列即可做出来,如果target的和大于等于nums的和s,那么需要把target%s即从target中把s删除,统计删除的s个数即可,然后现在的target又变成了target小于s的情况了,又可以用方法一做了。核心思想:从环上的根节点去枚举,这里借用一下灵神画的图。这里我们不这样跑,我们反向跑,环上的节点是3个节点,然后环上节点的父节点就是4个节点,父亲的父亲就是5个节点,以此类推。

2023-10-02 21:09:25 416

原创 1340. 跳跃游戏 V;2039. 网络空闲的时刻;2767. 将字符串分割为最少的美丽子字符串

核心思想:我们需要找到每个服务器变为空闲的最短时间,然后维护一个最大值。得到一个结论:每个服务器与0服务器的最短距离为d,根据 2*d与p即与重复发送的关系可以得到,其变为空闲时间为2*d-t+1+2*d即4*d-t+1(这部分可以看灵神的题解我就不赘述了),然后如何求每个服务器到0服务器的距离,这里用BFS,即从0开始扩散。核心思想:记忆化搜索,有点类似分割字串,dfs(i):表示从i开始分割需要的最少数目,然后枚举下次分割的结束位置,维护一个最小值即可,枚举的字串是预先处理好的即,5的幂次。

2023-09-30 22:18:30 464

原创 1616. 分割两个字符串得到回文串;1717. 删除子字符串的最大得分;1605. 给定行和列的和求可行矩阵

相当有技巧,其实看到题解可能很简单,但事实上不好想。核心思想:一行一行填,填完后更新行和和列和,每个格子可取的值为行和和列和的最小值,借用一下灵神的图,旁边的数字就是行和,和列和,想当于一个模拟过程,蓝色问号就是待填写数字,旁边的黑色数字就是行和和列和,问号填两个值的小值,然后更新即可。核心思想:一个结论,分出来的字串比如aabbaa不论你删除ab,还是ba,还是ab,ba混合删除,你的最大删除次数是不变的都是两次。所以我们优先删除分数多的,然后在删除分数少的,这部分使用栈来模拟,可以看一下代码注释。

2023-09-28 19:49:40 637

原创 2002. 两个回文子序列长度的最大乘积;2212. 射箭比赛中的最大得分;924. 尽量减少恶意软件的传播

看initial的颜色块划分是怎样的,对于initial来说,如果有两个节点的颜色块是一样的,那么删除其中一个节点毫无意义,所以我们只能找其中属于单独颜色的一个,并且是单独颜色所占颜色块最大的,如果都没有那么就返回最小的即可。核心思想:二进制数表示状态,1表示bob胜利的区域,那么它的射箭数至少为alice[i]+1,然后我们枚举每个状态,用active记录下满足要求且分数最大的状态,最后枚举每一位统计结果即可。核心思想:求x的回文子序列的最大长度+二进制数枚举。用一个二进制数来表示对字符的选择。

2023-09-27 11:44:44 109

原创 1526. 形成目标数组的子数组最少增加次数;2008. 出租车的最大盈利;1589. 所有排列中的最大和

核心思想:差分数组。对于一个数组a,要想从全为0的数组增加1变为它,等价于从a减少1变为全0的数组。然后a有一个差分数组d,对于a区间的[L,R]减少1操作等价于对d[L]-1,然后d[R+1]+1。你想让a变为全0,即让d也变为全0,每次操作相当于让d的前面一个数-1,后面一个数+1。由于d的所有前缀和是大于等于1的,因为前缀和代表的是a中的一个数。因为你对正数减少一你可以让后面的负数加一,又因为前缀和大于等于0的,所以让正数全为0后,你的负数肯定也全为0了,具体证明可以看官方题解。核心思想:动态规划。

2023-09-26 14:22:06 53

原创 leetcode 第 364 场周赛

比如求当前值到后面的满足要求的值。枚举到当前值是小于栈顶元素的,那么我们肯定需要把栈顶元素拿出来,然后替换成当前值,详细的解释可以看灵神题解有很详细的解释,这里栈的功能就是优化的,帮助我们求出满足要求的前缀和后缀和。所以我们可以只枚举质数节点作为根节点的合法路径数目和,假设x为质数根节点,它有三个子树,分别2,3,4,2表示这个子树能枚举到的所有非质数个数,那么2*3;核心思想:枚举每个值作为峰值,然后从当前值,往前进行遍历不断取最小的,同理往后遍历,也不断取最小的,时间复杂度为O(n**2)。

2023-09-25 20:19:25 215 1

原创 2808. 使循环数组所有元素相等的最少秒数;1015. 可被 K 整除的最小整数;1001. 网格照明

最多需要多少秒是怎么计算的,我们可以把相等值的下标拿出来,然后你会发现两个相邻下标(相邻下标只的是两个值相同,它们的下标距离最近的情况)扩散的时候将它们之间的元素扩散完,需要//2秒,因为每次扩散两个元素,我们只需要统计相邻下标的最远距离//2即可。核心思想:如何将查询一次做到O(1)。如何判断一个点是否被点亮,在于判断它的行,列,正对角线,反对角线。然后发现行列很好表示,对于正对角线,一条对角线上的r-c是一样的,对于反对角线,r+c是一样的,通过这个方法我们可以在O(1)的时间内做到查询。

2023-09-24 21:29:37 106

原创 955. 删列造序 II;1838. 最高频元素的频数;1392. 最长快乐前缀

核心思想:我们可以按照一行一行排列strs,删除索引序列就代表删除某一列,那么我们如何判断一列是否应该删除呢,我们可以从反方向思考,应该保留那些列呢?从第一列开始,如果它不满足字典序肯定就不保存,如果它加上后面的列依旧满足的话就保存,反之判断下一列。即后面的某些列加起来如果满足字典序,如果前面有一列满足字典序加上这列肯定也是满足的。统计前面的l与r之间的差值小于等于k的结果,随着r增大l只能增加,因为如果r增加l减少,l就不满足前面的要求l是r的最远的满足要求的了,所以这题可以用滑动窗口来解决。

2023-09-23 18:56:50 111

原创 2101. 引爆最多的炸弹;752. 打开转盘锁;1234. 替换子串得到平衡字符串

首先要读懂题目意思待替换子串是一个连续的串,然后搞懂这个之后要明白当替换字串外面的有一种字符大于m,你是无论如何是无法将这种字符变为m的,所以你需要保证窗口外面的字符都是小于等于m的,当满足这个条件,你可以把窗口缩小,然后只需要维护最小值即可。核心思想:典型BFS,就像水源扩散一样,将'0000'放入q中,然后枚举'0000'每一位的上下变化放入q中,最后找到答案,难点在于如何得到一个数'2345'的变化数,这里的处理方法是写三个函数,get(x)表示得到x的变化数。核心思想:枚举+BFS。

2023-09-22 23:04:39 206

原创 1536. 排布二进制网格的最少交换次数;754. 到达终点数字;1106. 解析布尔表达式

枚举每一行,然后去找离这行最近的满足要求的那一行。我们用j保存每一行的最后一个1,那么尾部的0个数为n-1-j,每一行需要的0个数为n-i-1,所以得出结论 i >= j。然后我们就去一行一行找,找到了就翻转,这里有个小技巧,就是在枚举每一行的时候用一个k=-1表示,如果最后k还为-1就没有找到。结论:1,4所需的步数是一样的,然后奇数的话,每多走一次就加1。用栈来模拟人的计算,如果遇到右括号,那么我们就处理这个右括号前面的计算,然后把它放入栈中,等所有都处理完了那么判读最后栈中剩余的值即可。

2023-09-21 21:39:36 73

原创 2054. 两个最好的不重叠活动;1255. 得分最高的单词集合;858. 镜面反射

核心思想:枚举+小堆。因为你最多可以参加两个时间不重叠活动,所以我们就枚举其中一个活动,用一个堆来维护右边界的最小值,因为我们的event是排序的,前面满足的max_r_v,后面的event也肯定满足,因为它的start只可能是大于等于前面的start。dfs(i,val)表示当前的得分为val时选择第i个words,对于第i个单词,有两种情况,选或者不选,选的话大体分为三部分,第一部分为cnt中删除word[i]的字母,第二部分为往下递归,第三部分为递归完恢复现场。

2023-09-20 22:34:56 93

原创 leetcode363周赛

这里统计结果的时候有枚举到重复的,比如统计过1,4,16,后面会统计到4,16..,因为4...16是包含1,4,16...这种情况中的,虽然这是多余的情况,但是我们只需要统计最大的结果就行。核心思想:问题重复化+二分,对于一种机器,如何求其可以制造的最大合金数量,那么有一种方法就是二分法,如果合金数量x满足,那么x-1满足,所以我们可以二分出一种机器的最大合金数量,然后通过这种方法得到所有机器的最大合金数量,然后取最大值即可,对于二分的边界,下界好取就是0,上界可以取都取最小值1来估计大概就行。

2023-09-18 20:12:27 174

原创 2064. 分配给商店的最多商品的最小值;1066. 校园自行车分配 II;1326. 灌溉花园的最少水龙头数目

假设商店商品数目的最大值为x,那么对于每一个quantities[i]需要多少间零售店呢,即 quantities[i]//x往上取,然后判断商店数量和n的关系,最后我们利用二分的方法找出最小的x即可。核心思想:记忆化搜索。关键在于dfs(i,pre)的定义为#表示给第i个工人选择自行车,已选择的自行车为集合pre,其曼哈顿距离和为dfs(i,pre)。核心思想:过桥建桥模板题,假如你想过桥,你肯定会优先选择连接当前桥的并且它的右边是最远的桥,遵循这种最优选择进行选择龙头即可。

2023-09-17 17:49:59 75

原创 2817. 限制条件下元素之间的最小绝对差;2305. 公平分发饼干;878. 第 N 个神奇数字

核心思想:动态规划(二进制数的动态规划)。f[i][j]表示i个孩子分集合为j的零食包的最小不公平程度 答案为f[k][1 << n-1],使用二进制数来表示零食包集合,然后我们枚举i和j即可,难点在于这里的j是用二进制是表示的,我们需要写清楚如何从一个二进制状态转移到另一个二进制状态,具体可以看代码,主要思路就是定义好状态,然后枚举二进制集合。核心思想:枚举+二分。我们去枚举nums[j],然后用一个数据结构去装nums[i],利用二分去找在这个数据结构中离nums[j]最近的值的下标,然后统计最小值。

2023-09-16 23:37:52 76

原创 2327. 知道秘密的人数;1722. 执行交换操作后的最小汉明距离;2537. 统计好子数组的数目

定义f[i]为第i天可分享秘密的人,那么第(i+delay ,i+forget)天,会增加f[i]个可分享秘密的人,如果i+delay超过了n,那么它只能是不可分享秘密的人,然后我们只需要统计最后一天不可分享秘密的人,然后和可分享秘密的人加起来,忘记秘密的人不用考虑它。然后枚举所有连通的下标,把source中的放入a,然后把target中的放入b,用cnt统计b中每个值的结果,如果a的值在b中出现,那么经过交换它肯定可以是相同值,所以把cnt[b]-1,如果一个值没在cnt中出现那么肯定会产生一个不同。

2023-09-15 23:02:29 523

原创 780. 到达终点;2360. 图中的最长环;1871. 跳跃游戏 VII

那么我们就考虑从终点到起点,由于起点为正数,那么终点(x,y)的上一步一定是(x-y,y)或者(x,y-x)很明显肯定是大值减去小的值,然后我们不断重复这种操作,直到,终点的x或者y等于起点的x或者y,又或者两个值相同的时候停止,因为这种时候再去减去一个数一定出现不合理的情况。所以当不是这三种的情况的时候一直循环,这里为了加速减法采用了%,最后判断剩余的tx,ty的情况。核心思想:动态规划+前缀和优化。然后下面放上伪代码和优化代码,主要是去优化any(j')那部分(j的范围(i-max,i-min))。

2023-09-14 19:41:59 329

原创 1054. 距离相等的条形码;823. 带因子的二叉树;1878. 矩阵中最大的三个菱形和

核心思想:前缀和+枚举菱形上顶点,以及水平方向长度。思路很简单,就是利用前缀和去统计四条边,但是代码很恶心,边界很容易出错,我自己也错了很多次,然后利用Answer来维护三个值。定义dfs(val)表示以值val作为根节点的满足要求的二叉树的个数。然后枚举arr中的数作为左子树的可能。这里对arr进行了排序,因为我们需要使用记忆化。核心思想:隔一个数填一个,优先填写出现次数多的数。注意点就是条形码的长度为奇数和偶数,但是我们遵循先优先填偶数就不会出错即可。

2023-09-13 23:12:28 65

原创 2100. 适合打劫银行的日子;2080. 区间内查询数字的频率;1774. 最接近目标价格的甜点成本

核心思想:动态规划。其实这题数据范围比较小,用递归也可以做,递归, # 表示从下标i的配料开始选择,当前的成本为cost,我们需要先处理上面选过的cost然后再判断能不能选择(代码容易错的地方),其实递归比较好理解;但是如果把两份改成几份,我感觉还是要用0-1背包的方法来做,首先将配料复制几份,我当时做的时候也是想到把配料复制一份,这里动态规划代码的细节挺多的,核心其实就是背包问题,可以先做一下背包在来做这个可能好理解一点。最开始的时候我是分开求前后缀的,这里可以把前后缀一起进行处理。

2023-09-12 17:39:42 152

原创 leetcode第362场周赛

其实这题思维不好想,就是把要拿出的石头坐标统计出来,那几个就统计几个,然后要拿入的统计出来,然后枚举它们的所有组合情况的最小值。统计覆盖区间,把nums中有的区间+1,维护区间我们用差分数组,然后求出差分数组的前缀和即是我们维护的区间,判断区间有哪些值是大于0的即可。核心思想:动态规划+KMP+矩阵快速幂,其实动态规划简单,主要是找到前一个动态和后一个动态的关系,然后具体怎么找的c可以看b站灵神的视频,这里只讲整体思路。核心思想:数学题,贪心做法,首先走斜线,然后走到终点看最短的路径是否小于等于t。

2023-09-11 22:45:44 276

原创 2672. 有相同颜色的相邻元素数目;1947. 最大兼容性评分和;958. 二叉树的完全性检验

我们可以固定学生不动,然后求出老师的排列组合,然后在求出这一次排列组合的最大兼容性评分和,然后维护所有情况的最大值即可,在统计每次评分和的时候,我们可以进行预处理,先预处理好每个学生老师的匹配情况了,求排列组合用的是双指针即leetcode 31下一个排列。然后将颜色修改,然后判断修改后index左右相邻的数是否是相同的,然后增加一。核心思想:完全二叉树有个性质,就是在你遇到空节点后就不会在遇到有值的节点了,所以我们可以利用这个性质去判断,利用flag标记空节点,然后不断判断它的儿子。

2023-09-09 21:42:36 157

原创 826. 安排工作以达到最大收益;2257. 统计网格图中没有被保卫的格子数;816. 模糊坐标

核心思想:排序+维护最大利润。核心思想:BFS扩散,首先将保卫格子变为-1,墙变为-2,然后枚举保卫周围的格子将其扩散,但是扩散不是四周扩散,我们用一个参数k保证其方向的一致性,避免了扩散到了其他方向,最后统计没有扩散到的格子即为0的格子。核心思想:枚举数分开的位置,然后将分开的两个数的所有可能分别装入两个res,然后枚举所有的情况相加,如何统计一个数的所有可能我们可以分情况讨论,代码中很清楚的写了,我就不在赘述了。

2023-09-08 21:25:44 173

原创 2140. 解决智力问题;1401. 圆和矩形是否有重叠;901. 股票价格跨度

核心思想:单调栈,维护一个单调递减栈,左边第一个数就是比当前值大的坐标,这个坐标和自己坐标之间的数就是满足要求的数,然后加入了哨兵inf,为了保证找到一个坐标,使代码更简洁。核心思想:动态规划。dp[i]表示解决i-n-1的问题所能获得的最高分数,注意需要倒叙遍历,因为i的状态由后面的状态转移过来的。核心思想:分情况讨论,圆心情况。借用别人一张图说明。

2023-09-07 19:17:31 106

原创 979. 在二叉树中分配硬币;1136. 并行课程;759. 员工空闲时间

核心思想:排序,然后一个个比较。然后排序,维护一个当前区间的最右值,如果start大于这个值,就统计一下结果,然后更新,如果小于等于这个值就直接更新一下边界即可。核心思想:BFS,类似扩散,首先把没有prevCourse的统计出来,然后一轮一轮扩散,但是这里有个技巧就是用一个size来统计是否学完这些课程了。那么这棵树至少需要移入或者移出abs(coins-nodes)个硬币,也就是这么多步,然后累计它们的总和即可。定义dfs(node),返回值为以当前节点为根节点的节点个数和硬币个数。

2023-09-06 14:07:15 42

原创 1801. 积压订单中的订单总数;1567. 乘积为正数的最长子数组长度;923. 三数之和的多种可能

遇到负数num,那么就要看前面负数的个数,如果负数个数为0,那么正数长度为0,如果负数长度不为0,那么相乘为正,正数长度就+1,然后负数长度,不论前面有没有正数,都需要在正数长度上+1,按照我的定义出发看两遍代码就明白了。如果直接枚举i,j,k,那么是O(n**3)超时了,所以我们就要进行优化,我们只用枚举i,然后把剩余的a[i+1:k]看作新的数组,那么就变成求两数之和的问题了,然后求两数之和,我们可以用双指针来做。这里是对arr排序过的,在没有重复数的双指针代码上改进一下就变成含有重复数字的了。

2023-09-05 14:18:13 96

原创 leetcode 第 361 场周赛

首先写出一串数字 0,25,50,75,100,125...你会发现任意一个数字都只可能出现00,25,50,75四种结尾,然后加上一种全部删除的情况0。求a-b的边数可以转换为r_a-r_lca+r_b-r_lac,所以我们不仅要求每个节点到根节点的距离,还要求出公共节点lca,lca由树上倍增来求的,然后统计a-b的所有边的值分别有多少个,分为两个部分,一个是y往上走的时候统计,一个是同时往上走的时候统计,然后最后是都往上走一步的时候统计,具体细节可以看灵神视频,这里就不再赘述了。

2023-09-04 22:12:47 389

原创 1372. 二叉树中的最长交错路径;1042. 不邻接植花;2385. 感染二叉树需要的总时间

类似于水源扩散,首先我们将扩散点放入q中,然后扩散它的父亲节点,扩散它的儿子节点,每枚举一层temp时间就+1,代表了时间。对于一个子节点,如果它是右子树,那么它往右走等于它父节点左边的长度+1,否则就重新开始,然后维护最大值即可,感觉这里用语言不好描述,借鉴一下别人的图。核心思想:就是枚举每一个花园,然后看与它相连的花园,且将已经选过的花的种类去除,然后从剩下的种类中选择一种即可,然后如何枚举花园,我们可以预先处理好花园的相邻花园。

2023-09-03 23:43:06 59

原创 2359. 找到离给定两个节点最近的节点;1781. 所有子字符串美丽值之和;2406. 将区间分为最少组数

核心思想:统计node1和node2分别到每个点的距离,然后在枚举每个点统计结果。关键在于如何统计node到每个点的距离,首先是初始化为inf很重要,因为在枚举的时候,因为是inf代表了这个节点无法到达,在统计的时候不是用的递归而是用的循环,其中包含了处理特殊情况环,思想简单代码还是有点难度。核心思想:用小堆栈q来维护所有的分组,其中q[0]表示一个分组它的最右边的值最小。我们利用贪心的思想,如果l > 最小值,那么就添加到这个组后面,否则的话只能开辟一个新组。q的长度就是组数的个数。

2023-09-02 21:57:40 176

原创 2017. 网格游戏;2397. 被列覆盖的最多行数;2202. K 次操作后最大化顶端元素

核心思想:前缀和+枚举。读完题后可以发现,第一个机器人走的路线就像一条分割线,第二个机器人只能获得上面白色部分或者下面白色部分的最大值。这个最大值怎么求,我们可以通过前缀和来求,然后通过枚举转折点来统计两部分最大值的最小值。由于这题列数比较小,所以我们可以用一个二进制数来枚举列,然后判断每一行是否被所选列数覆盖。怎么判断某一行是否被覆盖即使用这一行的二进制数和所选列数的二进制数进行and,如果覆盖那么值会一样。核心思想:数学题,分情况讨论,这题可以看作一道数学题来解决,根据k与n的大小关系来讨论结果。

2023-08-30 19:46:00 337

原创 1239. 串联字符串的最大长度;2826. 将三个组排序;2563. 统计公平数对的数目

核心思想:递归,选或者不选,定义dfs(i,pre)表示从i-n的满足要求的arr中选择字符串串联所能获得的最大长度为dfs(i,pre),pre表示已经选过的字符串所组成的集合。这里判断是否有公共字母利用了位运算,用二进制数来表示一个字符串,比如abc就等于111,c就等于100,然后1表示含这个字母,这里有一个误区就是arr不用处理,不容易想到,如果arr中的单词已经有相同字母了,那么我们就把它从arr中删除=不添加到masks,masks想到于剔除不满足要求的字符串后每个字符串的二进制数。

2023-08-29 22:33:21 163

原创 2070. 每一个查询的最大美丽值;2416. 字符串的前缀分数和;2261. 含最多 K 个可整除元素的子数组

简单想法就是枚举每一次的查询,然后枚举出小于等于查询值在items中的最大美丽值,这种做法肯定超时了,那么如何进行优化,就是利用二分法降低查询的时间,然后我们需要先对items进行排序和更新,统计出价格小于等于当前items[0]的最大美丽值,然后二分的话用几种选择,这里我选择的是自己最熟悉的左闭右闭。核心思想:枚举每一个子数组,然后将满足要求的子数组放入seen中,然后看最后有多少个子数组满足要求,在枚举子数组的时候有一个优化,就是子数组的长度是慢慢增加的,如果前面不满足后面肯定也不用计算了。

2023-08-26 17:41:42 103

原创 1014. 最佳观光组合;1220. 统计元音字母序列的数目;1011. 在 D 天内送达包裹的能力​

核心思想:枚举+优化,简单想法就是枚举i在同时枚举j,但是这样做时间复杂度太高,那么我们就要想办法优化它,values[i] + values[j] + i - j可以分为values[i] + i,values[j] - j两部分,我们在枚举values[j]-j的时候同时维护一个values[i]+i的最大值即可。核心思想:方法一,动态规划加状态压缩,方法二,记忆化搜索,方法三,动态规划+矩阵快速幂加速,这里的方法是方法一。

2023-08-25 22:19:53 93

原创 1273. 删除树节点;2786. 访问数组中的位置使分数最大;889. 根据前序和后序遍历构造二叉树

构造左子树,构造右子树又可以分解为构造根节点+构造左右子树,从而解决这一问题,然后关键就在于找根节点,根节点pre[0],然后如何递归左子树,找到pre[1]在pos中的下标即可找到左子树的长度,从而分解出左右子树。核心思想:递归,从根节点出发,枚举父节点的子节点,如果它们的值加起来为0的话就把父亲的节点删除后剩余的数置为0,默认返回一个节点,del_remain保存的是,del_remain[x]表示完成删除操作后以x节点为父节点剩余的节点个数。

2023-08-24 21:14:36 121

原创 2048. 下一个更大的数值平衡数;1292. 元素和小于等于阈值的正方形的最大边长;2707. 字符串中的额外字符

优化部分有两部分,第一部分是计算面积的优化,预先处理好g,让我们可以在O(1)的时间内处理好面积,第二部分优化是ans的优化,即长度的优化,当计算出一个5的长度满足时,我们就没必要从1,2,3..开始计算了,直接从6开始计算,如果没有6满足就返回5,如果6开始都已经大于阈值了,也没必要往7计算了因为结果只能更大,所以break。核心思想:记忆化搜索,第一种方法就是拆分法,枚举拆分的起始位置i,在枚举拆分的结束位置j。第二种方法,是枚举第i个字符是直接剩下还是不直接剩下当作一个整体进行枚举。

2023-08-23 19:57:28 64

原创 1079. 活字印刷;1593. 拆分字符串使唯一子字符串的数目最大;1814. 统计一个数组中好对子的数目

拆分题,又可以用我前面的那种拆分模板来做,842,首先是从i开始拆分,然后枚举end即j,判断当前的字符串cur是否和前面重复,然后拆分长度加1,前面的拆分题是问你是否可以拆分出来,能够拆分出来就可以了,但是这里是问你最大最长是多少,所以你还需要回溯找到所有的情况。核心思想:回溯法,其实这题就是排列组合,只不过这题是每一个分支都要收集一次结果,然后去重。这里的代码用的是标准的used标记的方法。核心思想:数对题,也叫数学题,首先将。

2023-08-22 20:11:36 54

原创 leetcode359周赛

灵神的方法是数学法,对于k,m = k//2,前半部分结尾为m,后半部分为k,k+1,..k+(n-m)-1,然后利用求和公式将这两部分统计起来即可。然后代码最后都加了一个1,是因为从0开始枚举的话,i-0就变成-1了,所以i+1表示的是0-i的房子,你可以先用i,然后把i加1即可。核心思想:将相同值的下标统计起来,然后利用滑动窗口,枚举相同值的最右边的那个判断窗口中的需要删除的数是不是大于k,如果大于k,left就加1否则统计结果。核心思想:动态规划。不卖f[i] = f[i-1],卖出的话。

2023-08-21 19:49:09 267

原创 1139. 最大的以 1 为边界的正方形;2087. 网格图中机器人回家的最小代价;1145. 二叉树着色游戏

核心思想:贪心策略,假设x为一号玩家染色的节点,那么总共有三部分,x的左子树,右子树,x的父子树,那么我们需要选择其中最多的部分,然这部分节点数大于一半即可。核心思想:枚举正方向的右下角坐标(i,j),然后你只需要判断四条边的连续一的最小个数即可,这里是边求连续一的个数同时求解结果。核心思想:脑筋急转弯,由于每走一次的代价都是正的,所以贪心直接走直线即可。

2023-08-20 23:34:28 360

原创 1391. 检查网格中是否存在有效路径;2502. 设计内存分配器;1638. 统计只差一个字符的子串数目

我们用一个diff来记录当前字符串不同的字符个数,如果等于一答案就加一,如果超过一就直接统计t的下一个字串,这题代码很巧妙,思想就是一个个比较s字串和t字串。枚举网格中的块,把能连通的连通在一起,最后看(0,0)和(m-1,n-1)是否连通,然后网格中的每个点坐标是二维的,然后通过x*n+y转换为一维,具体的细节看代码,还是比较不好写的。核心思想:因为数据范围只有1000,并且只调用了1000次,所以只用枚举即可,最复杂的功能是allocate的实现,这里我们用一个cnt来统计是否够连续的内存。

2023-08-19 22:46:27 123

原创 1849. 将字符串拆分为递减的连续值;1024. 视频拼接;1530. 好叶子节点对的数量

核心思想:大树化为小树。求一棵二叉树的好叶子节点对的数量,可以转换为以当前节点为好叶子根节点的数量,加上左子树的数量,加上右子树的数量,然后如何算以当前节点为好叶子根节点的数量,首先要得到距离左子树x,距离右子树y的叶子节点,x+y+2=distance,然后我们枚举x即可。核心思想:贪心,如果两个视频的左端点一样我们肯定选那个右端点远的,不可能选择两个一样的左端点,然后我们遍历的同时维护当前可以到达的最大值以及上一个左端点选取的右端点的值。因为distance很小,所以可以用一个数组来维护。

2023-08-18 19:33:42 92

空空如也

空空如也

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

TA关注的人

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