- 博客(23)
- 收藏
- 关注
原创 【LeetCode3330】找到初始输入字符串 I(C++)
一道比较简单的题目,我们需要特别关注有连续重复字符的部分,当此处有n个连续的相同字符,那么他可能产生出n种不同的可能。比如bbbb(n=4),可能原字符串是b,bb,bbb,bbbb,四种可能。所以我们从前到后对字符串进行扫描,如果当前字符和前一个字符相同,那么此处可能会因为当前重复的字符产生一种不同的结果。因为只可能有一种字符输入时犯错,所以我们不需考虑多种字符同时出错时的累乘问题。给定一个字符串,由于键盘卡顿问题,其中某个字母会被错误的连续输入多次,如abcccccc。请返回原字符串可能有多少种可能。
2025-07-01 13:58:35
144
原创 【LeetCode594】最长和谐子序列(C++)
所以我们从小到大对有序数组进行扫描,如果当前数字和下一个数字相同,我们累加计数。否则我们判断当前的数字和它前一个数组成的子序列长度是否为当前最长。首先我们将数组按从小到大排序,对于每个数字为了满足题目要求,我们只考虑比他大1或小1的数字个数。给定一个数组,要求从中找一种最大和最小值只差1的子序列,返回最长的这种子序列的长度。因为只需要返回序列长度,所以我们可以不考虑数字在原数组中的顺序。对于最后一个数字,我们需要额外判断一次。
2025-06-30 14:26:22
177
原创 【LeetCode2099】找到和最大的长度为 K 的子序列(C++)
我们选择用一个结构体来同时记录原序列中每个数的大小和在原序列中的位置,首先我们按照数字大小进行递减排序,以便得到最大的k个数。题目分为两个步骤,第一找到序列中的最大的k个数,第二将这k个数按原序列中的顺序排序。对于排序后的序列,我们将前k大的数根据其在原序列中的下标大小进行递减排序。给定一个数组,从其中选择k个数使得和最大,按原序列中的顺序输出这些数。排序后的前k个数即是题目要求的结果,同时保证了大小和原顺序。
2025-06-28 16:22:15
159
原创 【LeetCode2311】小于等于 K 的最长二进制子序列(C++)
还有大于33位的1不再被选择,因为其代表的值已经大于k的范围,额外写了if(ans>33)的判断是因为,可能会遇到字符串为10000......(后面超多0)的情况导致er变量爆炸而错误的判断是否sum+er<=k。那么应该怎么删,我们发现高位的1代表的数字很大,由于k的大小只有1e9,所以我们可以确定高于第33位的1我们一定是不要的,因为每一个就代表2的三十多次方,大于了k的范围1e9。所以代码的思路就是,从低位向高位开始扫描,如果是0则必选,如果是1,判断加入后是否还满足小于等于k。
2025-06-26 21:16:48
125
原创 【LeetCode2040】两个有序数组的第 K 小乘积(C++)
此时需要注意假设num2中数字为-3,-1,2,4,5,当nums1[i]为正数比如2时,乘积得到的会是一个递增序列-6,-2,4,8,10。而当n为负数时,比如-2,得到的序列将会是6,2,-4,-8,-10将会是递减的,所以在二分查找时我们需要通过nums1[i]的正负进行不同的比较。因为两数组的长度范围是5e4,所以k的长度可能达到5e4*5e4,那么即使寻找规律来枚举,当找到第k个的时候也会超时,所以通过先找到第k小,再求出该数字似乎是行不通的。直至找到最合适的答案。
2025-06-25 19:54:54
213
原创 【LeetCode27】移除元素(C++)
一个简单题,我们从前到后对数组进行扫描,如果找到等于val的数,将其扔到数组末尾,并将队尾的数字换过来。然后我们需要再次判断当前位置,因为从队尾换过来的数依然可能为val,所以在循环中i--,循环下一会再次判断当前位置。同时队尾指针减一,因为我们已经找到了一个val,并将其放在合适的队尾位置,下次需要交换的数字位置,会从之前的尾指针向前推一格。给定一个数组和一个值val,要求统计数组中等于val的数的个数,并把这些等于val的数字都挪到数组的最后。
2025-06-24 19:41:26
164
原创 【LeetCode383】赎金信(C++)
采用两个桶数组记录字符个数,先统计b数组,然后在统计a数组时,如果发现当前字符已经比b中该字符更多,那么直接返回false。我们需要统计两个字符串中每个字符出现的次数,并确保对于任意一个字符,其在b中的个数都要大于等于a中的个数。给定两个字符串a和b,请问字符串a能否完全用b中的字符构成。如果a中所有字符都统计完仍没有问题,则返回true。
2025-06-24 15:12:42
199
原创 【LeetCode2200】找出数组中的所有 K 近邻下标(C++)
我们的思路是,从前到后遍历数组,判断每个数是否为我们想要的key。如果是,寻找此处范围为k的相邻区域,注意相邻区域别超过边界。一道简单题,其中有两个任务,第一是找到所有符合要就的key,第二是记录其领域数字的下标,但是要注意记录下标时需要避免重复。给定一个数组和两个整数key和k,要求找到数组中值为key的左右相邻k个数区间的数字的下标。在记录时,为了避免重复,我们开了一个桶数组,用于确保每个数字的下标只会被记录一次。
2025-06-24 13:18:27
131
原创 【LeetCode2081】k 镜像数字的和(C++)
但是此时还有一个问题是,对于数字32,其可以拼出两种情况3223和323,所以对于每个数字我们需要进行两次拼接,一种是直接把该数反转拼接,一种是将该数个位去掉后反转拼接(比如4235,去掉个位后拼接4235-324 )我们发现可以将一个数字对折,比如对于数字32,可以用其构造出3223,那么我们只需从小到大枚举数字,再将其对折拼接,便可以枚举出所有回文数。给定两个数n和k,从1开始从小到大寻找n个数,满足数字是回文的,同时该数字转换为k进制也是回文的,求这些数字的和。注意开longlong!
2025-06-23 14:00:20
120
原创 【LeetCode2138】将字符串拆分为若干长度为 k 的组(C++)
否则我们需要取出剩余的字符串,并且拼接上若干个fill字符补足。个数为i+k-s.size(),即当前位置距离达到k的长度差多少个字符。一道简单题,给定一个字符串s,要求将其从前到后每k个字符划分一次,最后不足k个字符拿fill字符补齐。最终返回多个划分后的字符串。我们从前到后对字符串s进行扫描,每次检查当前位置i开始是否能划分出一个长度为k的组,即i+k不超过原字符串s的最大长度。我认为主要考查的是vector和字符串相关函数的使用。如果没有超过限度,我们直接将这段部分搬运到vec。
2025-06-22 11:30:37
152
原创 【LeetCode3443】K 次修改后的最大曼哈顿距离(C++)
题目大意为给定一个指令字符串,每个位置是向东西南北方向移动,可以最多修改其中k个指令为其他任意方向,求出移动过程中可能距离原点的最大曼哈顿距离。选择后遍历一遍指令字符串,如果当前方向是我们选择的方向,那么提供正向效果。一个贪心的思路,我们每次选择在两个方向上发力,东和西之一,南和北之一。如果修改次数用完,那么不想要的方向只能提供负面效果,dis--。否则我们使用修改,让其变为我们想要的方向,提供正向效果。最后通过试完不同的方向组合,得到最优解。
2025-06-20 16:27:11
209
原创 【LeetCode2294】划分数组使最大差为 K(C++)
排序后我们对数组进行从前向后遍历,用move_head表示当前划分数组的最小值,因为原数组已经有序,所以如果当前位置减move_head大于了要求的最大差K,说明当前位置以及之后位置的数字已经不能和move_head放在同一个数组里,我们在当前位置之前进行划分。此时当前位置变为新的数组头部,并继续遍历,寻找下一个划分位置。题目大意为给定一个数组,要求将其划分为多个数组,使得划分后每个数组最大和最小数的差不超过K,求最少需要划分多少组。
2025-06-19 16:23:54
157
原创 【LeetCode66】加一(C++)
对于最高位进位的情况,因为在数组中最高位在digits[0],无法再在其前面添加数字,所以此处我们重新定义一个vector数组,长度比原数组大1,并将最高位置为1即可。在数组中即在该数字的前一个数字上加一,如循环中i--,然后继续判断此时的加一是可以直接加还是需要再进位。类似于高精度加低精度运算,然而这里只需加一更简单一些,因此,我们并不需像高精度加法一样把数字先翻过来,而是直接在原数上进行运算。对于需要进位的情况:又会分出两种情况,一种是正常进位,一种是最高位需要进位。
2024-05-14 16:39:52
246
原创 【LeetCode994】腐烂的橘子(C++)
采用广搜的方法,每次从烂橘子队列的队头提取烂橘子坐标,然后分别看它的上下左右四个方向是否为好橘子,如果是则将其传染为烂橘子,并添加到烂橘子队列的队尾,同时其腐烂时间为队头橘子腐烂时间的下一分钟。首先对网格进行预处理,分别将好橘子和烂橘子的坐标记录到两个队列que中,此处用数组模拟队列,在记录是还使用到了一个小技巧,如果同时记录行列信息需要两个变量,根据数据范围行列都小于等于10,所以我们将行列拼成一个四位数,例如3行5列记录为0305=3*100+5,10行1列记为1001=10*100+1。
2024-05-13 11:13:17
358
原创 【LeetCode20】有效的括号(C++)
当遇到右括号时,判断其与栈顶元素是否能匹配,如果匹配,则弹出栈顶,即把匹配的左括号弹出,如果不匹配则先入栈。题目大意为,给一个由()[]{},六种字符组成的字符串,要求判定其中的括号是否相匹配。例如,字符串( [ ) ] ,虽然每个左括号都有相应的右括号,然而因为顺序,所以该字符串也不是有效的。在遇到右括号时,其实如果不与栈顶括号匹配可以直接return false结束,因为右括号进栈后并没有出栈条件,右括号永远都不会出栈。下图以( [ ] { [ ] } )为例,展示了进栈出栈过程。
2024-05-12 12:00:00
648
1
原创 【LeetCode2960】统计已测试设备(C++)
只要读懂题目意思,按要求来完成就好。用ans记录遍历过程中大于零数字的个数,同时ans也代表着后面的数字要被减几次。例如,在遍历到当前位置是ans为3,那么说明在这个数之前有3个大于零的数,那么当前数字应该被减3次,所以我们看当前数字减ans的值是否大于0来判断。题目描述讲得很复杂,实际上是给定一个数列,从前向后遍历,只要当前数字大于零,就会让其后的所有数字都减1,统计遍历过程中有多少数大于零。
2024-05-11 12:00:00
277
1
原创 【LeetCode42】接雨水(C++)
经过思考后可以发现每个位置能接到的雨水量取决于该位置左侧的最大高度left,该位置右侧的最大高度right以及当前位置的高度height,其实是left和right中的较小值减去当前位置的高度,即min(left,right)-height。在代码中,我们通过一遍从前向后和一遍从后向前的循环在left[i]中记录位置i左侧最大高度,right[i]中记录位置i右侧最大高度,最后通过公示min(left[i],right[i])-height[i]计算每个位置的存水量。
2024-05-10 12:00:00
376
1
原创 【LeetCode88】合并两个有序数组(C++)
一道归并排序,定义两个指针one和two,初始时分别指向两个数列的头部,每次比较两数列中指针位置的数字,将较小的数字放入排列好的队伍a中,然后将指向较小数字的指针向后推一位。以此重复比较,直到一个数组的中的所有数字被比完,即while循环条件不再成立。最后将没有比较完的那列数字并在a后,a即为合并后的数列。更快的方法:对两个数列从后向前比较,这样比较完的数字可以直接放在nums1中应该在的位置,因为已知了合并后数列长度为m+n,可以省去定义数组a和再用数组a覆盖nums1。
2024-05-09 12:00:00
435
原创 【LeetCode283】移动零(C++)
本方法对数列从前向后进行遍历,用n记录当前已有几个非零元素。注意:第n个非零元素,在处理后的数列中应该排在第n位,所以将其放在nums[n]的位置(注意数组下标从0开始),原位置本该置为0,但是需要注意,如果数字本身就排在它应该在的位置,则不能将该位置清零。例如对于数列[1,2,3],当i=0时,此时n为0,并且该位置num[i]不为0,但是我们实际并没有将该位置的数挪动,所以不能将原位置置为0,否则数列中会有元素丢失。题目大意是给定一个数列,对数列重新排列,将0元素放在数列末尾,其他元素顺序不变。
2024-05-08 12:00:00
498
原创 【LeetCode26】删除有序数组中的重复项(C++)
因为是非递减数列,所以如果出现重复的数字则必然是相邻的,同时这里的k就是数列中有多少不相同的数字的个数。那么我们从数列第二项依次和自己的前一项进行比较,如果和前一项数字不相等,那么我们找到了一个不同的数字,让k++,并且将这个数字放入新的数组a的最后,方便最后输出去重后的数列;值得注意的是,在从前向后遍历时,我们是从第二个数开始每个数字和前一个数字比较,那么对于数列中的第一个数,我们默认其为数列中的一个新数,所以在初始化阶段,我们将k初始为1,并且将数列第一个数直接放入数组a中。
2024-05-07 21:19:57
686
1
原创 博客迁移链接
以前博客的链接就都在上面了,之后更新的博客会更新在优快云上,主要内容为算法题,希望能够养成坚持刷题的习惯。路漫漫其修远兮,吾将上下而求索。
2024-05-07 20:30:42
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人