没事就刷题
文章平均质量分 63
讲解一些力扣或者牛客上面的题
稻草人敲代码
懒得写简介
展开
-
【笔试训练】day24-day48合集
设原来字符串长度为n,所以我们只需要维护一个区间为n的子串,从中间分开,看分开的两个区间中1的数量是否相等。由于非0即1,1的数量确定,0的数量也就确定。值得注意的是,求树的高度时不能自顶向下,这样总的时间复杂度就是N^2.为了避免重复计算一些节点的高度,可以采用自底向上的方式。于是我们枚举长度为n子串的左端点,右端点也就确定了,在用前缀和O(1)的时间复杂度内求出这个区间左右两半1的数量。这题的要求又是一个谜。空间复杂度为1,这意味着都不能递归,因为递归开栈的空间复杂度就不止O(1)了。原创 2024-05-10 23:34:46 · 242 阅读 · 3 评论 -
【笔试训练】day23
再计算杀一只小怪要扣多少血就好了,再用总生命值去除这个扣血量,得到的就是最多杀死小怪的数量。每次将一条边上的两个点加入到一个集合里面,最后计算集合的·数量就好了。即如果字符串A和字符串B有一样种类的字符且每种字符数量都相等。给出一个技巧,直接将AB排序之后比较看是否一样就好了。思考这样一个结论:一个字符串如果可以任意交换相邻位置,代表这个字符串可以随意排列。由于是先手攻击,如果一次攻击就能杀死小怪,那么说明可以为无限杀小怪。所以我们只需要比较AB每一种字符的数量和种类是否相等就好了。原创 2024-05-10 17:14:04 · 263 阅读 · 1 评论 -
【笔试训练】day22
在添加字符之前,A和B最多相等的位数是多少?由于A后面可以添加字符,也就使得A字符可以在B的任意一个位置开始比较。遍历一遍这个比较的起点,从这个起点开始跟A比较,看有多少相等的。用一个变量维护这个添加字符前最多相等的数量。由于是可以添加任何字符,我们默认添加多少,就有多少个相等,即两个字符的长度差。排个序,遍历一遍数组,看当前元素的前一个元素是否能通过不断乘2来等于它。01背包,只不过最大价值变成了最大利用空间。求最少不相等的位数,可以先求最多相等的位数。最小剩余空间,即v-最大利用空间。原创 2024-05-08 23:35:05 · 311 阅读 · 2 评论 -
【笔试训练】day20
所以在经过min(n,m)轮回合之后,他们两个人至少死一个。枚举每一个区间的右端点,f[i]表示以第i个元素结尾的区间的最大和是多少。对于对立来说他最多承受n轮光的攻击,对于光来说,他最多承受立得m轮攻击。遇到这种连续得区间题目,要么枚举左右端点,要么就是枚举右端点。直接计算出经过几轮攻击后,会出现人员伤亡。自己去推一下就好了。原创 2024-05-06 23:40:36 · 312 阅读 · 1 评论 -
【笔试训练】day19
分别指向第一个字符串和最后一个字符串。只需要判断这俩字符串有没有相同的元素,如果没有,说明一定不能构成回文串。有则l++,r--继续找相同。想一下我们是怎么判断一个字符串是不是回文字符串的。从两边到中间不断的看是不是相同字符。快速判断俩字符串有没有相同元素,可以用位运算。或者用一个map遍历也可以。跟着题目一路模拟就行,注意longlong。同样的,我们也可以从n个字符串中,原创 2024-05-05 21:21:57 · 240 阅读 · 3 评论 -
【笔试训练】day18
因为j-vw[i-1][0]一定小于j,不会影响到以及遍历过的dp[j]拿还是不拿,拿的话就dp[j-vw[i][0]]+vw[i-1][1],不拿就dp[j](i-1时)。双指针维护一个相同字符的区间。注意个数可能是一个两位数,得用tostring.优先把甜度高的排在前面,甜度一样就优先酸度低的。dp[j]表示背包容量为i时能最多存放多少重量。原创 2024-05-04 14:33:56 · 357 阅读 · 0 评论 -
【笔试训练】day17
前缀和维护快乐值和羞耻值,枚举每一天,假设在当前天吃掉桃子,看能不能更新答案。用俩数组分别维护每行和每列的和就好了。注意long long。遇到按位处理的情况可以考虑用字符串去读。原创 2024-05-03 17:07:52 · 184 阅读 · 1 评论 -
【笔试训练】day16
枚举区间的每一个数字,并枚举这个数字的每俩个数位的组合,并判断是不是质数就OK了。时间复杂度为1e5*25*log(100),大概就是在1e7的级别。也可以用一个质数筛提前把100以内的质数筛出来,时间复杂度就在1e6的级别。又是一个题意都说不明白的题。最小子序列长度,到底是子串还是子序列啊。既然是定值为啥还要说最小啊,服了。这题就不用算比例,因为长度是固定的,直接比较cg数量就好了.原创 2024-05-01 21:19:04 · 325 阅读 · 5 评论 -
【笔试训练】day15
遍历每一条边,遍历的同时删除当前边,即入度减减。如果这个点的入度为0了,就入队列。拓扑排序保证,越早入队列的点,一定越在路径的前面。每次二分的mid表示当前的所有分组中,拥有最多人数的组的人数。以此为基准,对所有的人进行分组,看能不能至少凑成m组,且这m组的每组最多人数不超过mid。如果某一个声部的人数超过mid,我们就把超过的部分添加到新的一组去。也就是,r是所有成功分组情况中,组内人数最多的值里面最小的。这样分可以得到以下结论:所有分组的最多人数不超过mid。且这样分组,组的数量是最少的。原创 2024-04-30 22:39:03 · 333 阅读 · 2 评论 -
【笔试训练】day14
其中dp[i]表示从值为[mi,i]里选的最大值。mp[i]表示值为i的元素出现的个数。选了i,获得的分数就是mp[i]*i。在n*3个人里面选n个人,这n个人每个人都可以在剩下的2*n个人里找出一个比他小的和比他大的,刚好组成n个队伍。接下来从后2*n个选手里面选n个,一定能组成一大一小的关系,于是我们间隔着组就行了。小的那个就是队伍的中间水平。对于值为i的元素,要么选,要么不选。选了值为i的元素,i-1的元素就不能选。于是dp[i]=max(dp[i-1],dp[i-2]+i*mp[i])原创 2024-04-30 11:48:37 · 216 阅读 · 1 评论 -
【笔试训练】day12
为了让字符串中的每个元素都“平均”的出现,我们可以每次然出现次数最多的字符和次多的字符去“凑成”一对。因为这些字符最危险,越是靠后处理这些字符,越容易出现相邻重复。用一个堆去维护当前每个字符出现的次数,当堆的元素大于1的时候,我们就可以取出最多的两个字符,这两个字符一定不同,我们把这两个字符依次加入到答案中。如果最后堆顶元素还剩下1,说明还有一种字符还没被“安排”。如果最后这个字符的次数还剩下超过1,那么说明一定会相邻。如果新加进来的一个元素导致了出现重复元素,那么我们就收紧左区间,直到没有重复元素为止。原创 2024-04-28 23:26:28 · 295 阅读 · 2 评论 -
【笔试训练】day12
子序列的相对位置是固定的。于是可以想到,对于每一个’y‘,前面能组成多少个”sh“。要想算出”sh“的数量,也可以用类似的思路。对于每一个’h‘,前面有多少个’s'就表示以当前‘h’结尾的”sh“序列有多少个。于是我们只需要遍历一遍数组,遇到‘s'就记录一下,遇到’h'就结算一下sh,遇到y,就结算一下‘shy'。先计算每个链表的长度,长的那一条就先走,走到剩下的节点数量和另一条相等。然后两个链表再一起走,直到找到相同节点为止。这个思路在LCA求最近公共祖先的算法里也有用到。原创 2024-04-26 21:43:00 · 275 阅读 · 3 评论 -
【笔试训练】day11
所以dp[i][0]=max(dp[i-1][1]+a[i],dp[i-1][0])第i天有股票,有可能是第i-1天没有股票,今天买的,所以收益-a[i].也有可能第i-1天有股票,但是今天不卖。第i天没有股票,有可能第i-1天有股票,但是今天卖掉了,收益+a[i],也有可能第i-1天也没有股票。再用两个变量表示第i天的有票和没票的状态。但是根据朴素版本的代码,我们可以知道,其实对于第i天的状态,它只会被第i-1天的状态影响。a2就表示dp[i][0],a1表示dp[i-1][0],b1,b2同理。原创 2024-04-25 23:01:16 · 486 阅读 · 1 评论 -
【笔试强训】day10
在第i天之后哪一天的票价最高我们就在哪一天卖掉。所以我们可以再用一个数组s[],s[i]表示i-n天的最高票价。dp[i][j]表示,从起点到(i,j)的路径有多少。如果没有马的干扰,那么dp[i][j]=dp[i-1][j]+dp[i][j-1]要想让dp[i][j]为真,则dp[i+1][j-1]必须也为真。否则就是false.即dp[i][j]=dp[i+1][j-1]这种做法的复杂度是N^2.还有一种叫马拉夫的做法,On的复杂度,但是我忘了,草。dp[i][j]表示字符串i-j是否是回文子串。原创 2024-04-24 23:43:30 · 351 阅读 · 4 评论 -
【笔试强训】day9
回归问题本质,数子0是癞子,不用考虑。用两个变量维护最大值和最小值就行了。中间该如何判断有没有重复元素呢?考虑用一个位图表示。第i位为1,表示i这个数子出现了一次。最后判断最大值和最小值的差值。如果差值大于4,不用考虑直接滚。小于4,且没有除了0以外的重复元素,那就一定是可以组成顺子。直接思考On做法.On做法不难,主要是还有空间复杂度为O1。这就意味着什么mp,数组统统错误。如果第i位为1了的情况下,又遇到了i.那就说明重复了直接false。题目要求空间复杂度o1,那就用两个变量迭代斐波那契数列就行。原创 2024-04-23 20:35:43 · 377 阅读 · 2 评论 -
【笔试强训】day8
没啥好说,都是一遍过。原创 2024-04-22 22:16:02 · 394 阅读 · 3 评论 -
【笔试训练】day7
还以为是去年蓝桥杯的原题,后来发现不是,本题不需要判断子岛屿问题。所以又是直接bfs就行,每次bfs把相邻的岛屿”染色“一遍,记录答案就行。数据范围很小,怎么暴力怎么来。用dfs枚举出所有棍子的排列组合,将前三根和后三个根棍子分别判断能否组成一个三角形就OK了。有兴趣的同学可以去看我写的14届蓝桥杯的题解,里面有这道题进阶的解法。简单双指针,随便怎么暴力。纯粹的手速题,一遍过。原创 2024-04-21 20:10:40 · 455 阅读 · 5 评论 -
【笔试训练】day6
因为我们存答案的数组c开的是理论上最大的空间,但是实际上可能不会用到这么多。两数相乘的结果最大的位数就是这两个数的位数和,比如10*100,最后的结果就是2+3=5位数。还有就是链表题在传指针作为参数的时候,注意二级指针的问题。值得注意的是,高精度乘法得到答案的最高位有可能不是一个一位数,比如2*10,此时的c[0]=10。c此时[i+j]里有可能大于10,我们需要进位,进位就是c[i+j+1]=c[i+j]/10。模拟一下自己做乘法的过程,每次a的第i位乘以b的第j位,其结果一定在c的[i+j]位。原创 2024-04-19 20:32:49 · 330 阅读 · 0 评论 -
【笔试训练】day5
今天的题,最后一题忘公式了,卡了一会退出来了。原创 2024-04-18 21:04:20 · 561 阅读 · 0 评论 -
【笔试训练】day4
不到5分钟写完,今天的题又又又难一点啦!原创 2024-04-17 22:46:32 · 430 阅读 · 0 评论 -
【笔试训练】day3
今天的题又简单了很多欸。原创 2024-04-16 20:13:27 · 449 阅读 · 0 评论 -
【笔试训练】day2
要注意的是,题目给的cnt[i]的意思是,第i个阶梯向上爬1或者2个阶梯的费用,而不是爬1个。(没看清题目,wa了我几发,草!最后的a[n]就表示从起点(1)爬到第n+1(顶部)个台阶的最少花费。起点有两种,一个是从0开始,一个是从1开始。,每找到一对str1和str2就更新一下答案,这个答案就是两个指针的距离。最后再比较一下不同的起点爬到第n个阶梯那个方法花费最少就行了。注意一个坑,首先就是加急是总共加5块,不是每千克加5块。3.如果两个都找到了,就用这两个指针的距离更新答案。思路呃,没思路,无脑就行。原创 2024-04-15 23:06:38 · 615 阅读 · 0 评论 -
第十四届蓝桥杯C++B组编程题题目以及题解
思路:设任意一条冶炼记录投入金属数量为a,产出金属为b.对于每一条冶炼记录我们都可以得到 一个转换率V的范围:b原创 2024-03-12 23:15:40 · 2074 阅读 · 1 评论 -
力扣2834. 找出美丽数组的最小和
很容易想到用等差求和公式(a1+an)*n/2来求解,但是项数太大,求得的结果可能会爆long long ,而且模运算没有除法。,原理和快速幂相识,化整体为局部,乘法转化为加法,既然一次性相乘太大,我们可以先加一部分(二进制分割)再模p。这题的思路很简单,求小于等于1到target/2的前缀和以及[target,n-target+1]的。,当a,p互质,a对p的逆元B就等于a^p-2(这一步可以用快速幂求).第二种是利用。,通过b*B(mod p)同余于1,解得B.和,并对结果进行取模。原创 2024-03-08 21:47:15 · 498 阅读 · 2 评论 -
力扣 790. 多米诺和托米诺平铺(一维dp)
两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。初始化,dp[0][0]=dp[0][1]=dp[0][2]=0,dp[0][3]=1。设计一个二维数组dp[i][j],表示以i列结尾的状态j的平铺方式的组合数目。上下两个正方形都有,记为状态 3,用dp[i][3]表示。一个正方形都没有,记为状态 0,用dp[i][0]表示。只有上方的正方形,记为状态 1,用dp[i][1]表示。只有下方的正方形,记为状态 2,用dp[i][2]表示。原创 2023-12-01 18:47:12 · 153 阅读 · 0 评论 -
力扣123. 买卖股票的最佳时机 III(状态dp)
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。4、第二次买入股票,或者是第二次买入股票后还没有第二次卖出股票,用dp[i][3]表示。原创 2023-11-14 21:02:25 · 293 阅读 · 5 评论 -
力扣 138. 随机链表的复制
给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的。深拷贝应该正好由n个节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。。例如,如果原链表中有X和Y两个节点,其中。那么在复制链表中对应的两个节点x和y,同样有。返回复制链表的头节点。用一个由n个节点组成的链表来表示输入/输出中的链表。原创 2023-11-06 22:54:52 · 871 阅读 · 18 评论 -
力扣421. 数组中两个数的最大异或值(字典树)
给你一个整数数组nums,返回的最大运算结果,其中。28最大运算结果是 5 XOR 25 = 28.127这里我们可以用,对于每一个节点都有两个儿子节点,0或者1,假如在这个树里要找一个与x异或最大的数,我们先找与x二进制中最高位的数异或得1的数,换句话说就是找不一样的数呗,假如x的最高位是1,那么要想异或的答案最大,我们看看这个树里面有没有这个位上是0的数,如果有走到这个节点去继续找下一位。用一个二维数组son[p][u]来模拟一个字典树,第一维表示字典树的节点,第二维表示每个节点的子节点。原创 2023-11-04 16:52:49 · 575 阅读 · 4 评论 -
力扣740. 删除并获得点数(动态规划)
给你一个整数数组nums,你可以对它进行一些操作。每次操作中,选择任意一个nums[i],删除它并获得nums[i]的点数。之后,你必须删除等于和的元素。开始你拥有0个点数。返回你能通过这些操作获得的最大点数。6删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数。总共获得 6 个点数。9删除 3 获得 3 个点数,接着要删除两个 2 和 4。之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。总共获得 9 个点数。原创 2023-11-01 22:56:30 · 392 阅读 · 9 评论 -
力扣100097. 合法分组的最少组数(哈希+贪心)
假设t表示的是nums数组中不同元素的个数,那么最小出现次数mi原创 2023-10-22 22:31:58 · 527 阅读 · 9 评论 -
力扣100114. 元素和最小的山形三元组 II(中等)
假设a[i]表示下标为i的元素作为山形三元组中间元素的最小和,a[i]=nums[i]+左边最小的数+右边最小的数,ans=min(a[i],ans).k的范围是1-nums.size()-2,我们遍历数组下标为1-nums.size()-2,当前的nums[i]表示的是山形三元组最中间的那个数,由于答案。这个三元组的元素和等于 nums[1] + nums[3] + nums[5] = 13。这个三元组的元素和等于 nums[2] + nums[3] + nums[4] = 9。原创 2023-10-22 22:02:23 · 663 阅读 · 2 评论 -
力扣1726. 同积元组
给你一个由正整数组成的数组nums,请你返回满足的元组的数量。其中abc和d都是nums中的元素,且。8存在 8 个满足题意的元组:16存在 16 个满足题意的元组:这个题目的大概的意思就是找四个不同的数,这四个数可以组成a*b=c*d的数量.因为题目给的数组的长度是1000,直接暴力找4个数肯定是超时。我们可以用一个数组num1把等式左边存下来,也就是把nums数组中任意两个数的乘积存下来,同时用一个map存下任意两个数的乘积的个数,时间复杂度是N^2。原创 2023-10-19 11:26:11 · 232 阅读 · 4 评论 -
力扣122. 买卖股票的最佳时机 II
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。原创 2023-10-02 21:06:17 · 119 阅读 · 4 评论 -
力扣2591. 将钱分给最多的儿童
首先我们就要判断什么情况下不能满足分配条件,一种是money小于children,此时不能让每个人都分到最少一美元,第二种是一定存在分给别人4美元的情况,也就是只有一个人,这个时候的钱又刚好等于4,不满足条件的第三点。然后我们还可以特判一下这种情况:假如money很大,即使每个人都分8美元都还有剩余,这个时候为了让剩下的8最多,只能把多的钱都分给一个人,这样一来,就有children-1个人分到8美元。记住这里求的答案不是分配方案数,而是在符合分配方案的集合里面去挑分得8的数量最多的一种方案。原创 2023-09-22 22:30:38 · 90 阅读 · 1 评论 -
2560. 打家劫舍 IV(二分)
还是打家劫舍,但是题目意思还是变了很多的,现在是要求选出至少k个房子,每选出k个房子里面都存在一个偷窃能力值,而这个偷窃能力值就是这至少k个房子里金钱的最大值(并不是和),最终答案是在所有选至少k个房子的方案里面,所有偷窃能力值的最小值。因为我们根据二分的思想,二分答案,把可以为答案的放在右边,把不可能为答案的方案放在左边,这么一来,在可以为答案的集合里面,最左边的就是这个答案集合里面最小的。- 窃取下标 0 和 3 处的房屋,窃取能力为 max(nums[0], nums[3]) = 9。原创 2023-09-20 00:17:24 · 129 阅读 · 5 评论 -
力扣337.打家劫舍3(树形dp)
1.选当前节点,意味着左右节点不能选,为什么是相加呢?一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。这道题其实就是树形dp的板子题,有兴趣的可以去看看上司的舞会这道题,可能容易理解一点。1.选这个房子,那么我们就不能选这个房子的左右节点,也就是题目给的相邻的房子。小偷又发现了一个新的可行窃的地区。我们用哈希表来映射根节点与当前这个节点可以偷的最大的钱的数量。2.不选这个房子,那么我们可以同时选其左右节点的房子。f[node]表示选这个节点的能最多偷多少钱。原创 2023-09-18 23:36:04 · 159 阅读 · 1 评论 -
力扣213打家劫舍2(简单动态规划)
f[0]=nums[0]且f[1]=nums[0](此时第二个房子一定不能选所以前2个房子的钱最多还是nums[0]),你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。对于最后一个房子来说,既然第一个房子一定选,那么最后一个房子就不能选,此时f[i]=f[i-1].f2[0]=0且f2[1]=nums[1].对于最后一个房子,可以选也可以不选,不冲突。于是乎,我们开两个数组,一个是存方案一的状态,一个是存方案二的状态。,今晚能够偷窃到的最高金额。原创 2023-09-17 16:28:17 · 207 阅读 · 7 评论 -
力扣198.打家劫舍(简单动态规划)
每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,因为根据题意,不能偷相邻房子的钱,如果你偷了第i个房子的钱,那么就不能算第i-1家的钱,只能加上偷前i-2栋房子最多的钱。偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。如果对以上思路还不清楚的同学,可以去b站搜索y总的背包九讲,讲得非常详细,有兴趣的也可以去看看。偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。原创 2023-09-16 21:59:52 · 131 阅读 · 8 评论 -
LCR 005. 最大单词长度乘积----位掩码的使用
然后通过左移操作 1原创 2023-09-15 09:51:03 · 170 阅读 · 5 评论 -
力扣1222.可以攻击国王的王后
因为题目给的棋盘的范围比较小,每个方向遍历一次,在遍历这个方向的时候往外面扩张,类似于雷达,最多也就遍历7次,然后判断这个位置是否存在皇后,是的话就停下来就好了。2、站在皇后的角度,遍历所有的皇后,查看当前皇后的坐标是否在国王的在八个方向上,如果是的,那么就再去比较当前皇后与上一个这个方向的皇后所在国王方向的距离,去一个最小值。1、站在国王的角度,向八个方向延伸,遇到这个方向的第一个王后就停下来,标记一下这个方向已经搜到最近的皇后了,在存到答案里面就行了。的棋盘上,放置着若干「黑皇后」和一个「白国王」。原创 2023-09-14 23:25:29 · 76 阅读 · 4 评论