- 博客(66)
- 收藏
- 关注
原创 力扣395做题笔记
我们要看当前窗口收集了多少种类,要控制它不能超过当前处理的子问题(require)的数量,否则就是不合规的,因为它应该在处理之后的子问题才考虑。字符都要大于k,我的写法错误地理解为只要有一种大于k的子串就行了。这里利用了一点动态规划的思想,这个字符串都是小写的字符串。那么就说明,最多有26种字符来组合一个字符串。相当于就26种子问题,组合一起就是总问题了。种,每种符合的长度,然后比长短既可以了。
2025-05-25 22:01:08
492
原创 力扣992做题笔记
不超过k的子数组数」减去「不超过k-1的子数组数」,本质是通过「前缀和相减」的方式,精准提取出「恰好等于k」的子数组数目。这种方法将复杂的「恰好k」问题转化为更易计算的「不超过k」问题,是滑动窗口算法中常用的技巧。
2025-05-19 16:27:17
752
原创 Leetcode134加油站
这意味着我们会少加一些余量,那我们想想,之前余量没少加的时候都到达不了l,现在余量少加了,还能到吗?从中我们可以得出一个结论:看一个点能不能到下一个点,就要用当前的油量减去消耗的量,那么gas[i] - cost[i],就表明这个点到了下一个点之后剩余的油量,如果是负数,说明它走不到下一个点,会在半路熄火。那么它的累加和的意义就是从累加起点到累加终点剩余的油量,如果为负数,那么说明我们当前选取的起点无法到达目前的终点,为正数好理解,还有余量,只要大于等于0,都是可以的。
2025-05-18 16:48:18
365
原创 Leetcode76覆盖最小子串
这里是把每一个字符扔到欠债表里面进行结算,如果是target里面的,说明他刚开始是负的,所以我们用是否小于0来判断是否可以对欠债总数debt来进行削减,到0的时候就说明我们要开始尝试收缩窗口了。可是题目要我们求最短啊,我们尝试收缩左边界,收缩的时候要注意,如果收缩会导致欠债那么就不能收缩,只能记住答案,拿去与之前比大小看是否能更新。要判断左边是否可以削减,就要看它的削减会不会导致债务的增加,也就是会不会导致现在的窗口不能完全包含target,所以进行此判断。此时我们发现,不仅不欠债还有了结余可以尝试收缩。
2025-05-16 21:02:30
471
原创 Leetcode209做题笔记
3.更新答案,初始化答案为一个很大的值,随后不断和每一次答案比大小,如有更小的答案则更新,没有则维持原来的答案。就是找符合条件的最小窗口,那么让左边一直动,只要区间和大于等于target就可以了,写一个循环加上判断条件。可以利用左右两个指针来进行,右指针增加为扩大窗口,左指针增加,往右移动相当于缩短窗口。此时长度为3, 与刚才的4比较发现比4还要短,那么答案更新为3.如此进行下去,即可求出答案。
2025-05-14 21:02:04
428
原创 Leetcode2266. 统计打字方案数
的话,init函数会调用多次,init函数只需要在类创建的那次初始化就可以了,后面直接用就行,不需要多次的初始化。就变成了当前与跳过1步的字符是否相等,因为我们做的是一个分割的过程,不可能每次只跳一步。我们是要比较当前step,也就是当前走到的字符与跳过i步之后的字符是否相等,如果写成。观察我们画的递归图,每个分支的答案可以存在数组中,减少无效递归。我们要进行的组合,本质就是对字符串进行分割。这和一般的组合不同的是,我们要确定不能存在。的长度是5,我们爬楼梯的方式有一次走。参考的是灵神的题解。
2025-05-08 10:59:44
931
原创 力扣完全平方数279和力扣91解码方法的做题笔记
动态规划的状态定义dp[i]:表示前i个字符的解码方式数。例如,dp[1]表示前 1 个字符的解码方式数。dp[2]表示前 2 个字符的解码方式数。以此类推。
2025-03-02 21:33:00
1127
原创 dfs的刷题小总结。
定义全局变量minSteps:用于记录最少按键次数。visited:用于记录已经访问过的楼层。修改dfs函数增加steps参数来记录当前按键次数。在进入新楼层之前,检查是否已经访问过。在到达目标楼层B时,更新minSteps。在每次递归调用dfs时,增加steps的值。初始化在main函数中,初始化minSteps。初始化visited数组。调用dfs从初始楼层A开始调用dfs,初始steps为0。
2025-01-25 19:52:53
1053
原创 基础算法——差分
可以发现,我们先对diff数组==[L,R] + v = d[L]+v,d[R+1]-v==处理,然后进行前缀和处理还原,就是在[l,r]区间进行+v的操作,那么我们在遇到这样的问题时,直接先把原数组的差分数组弄出来:diff[i] = arr[i] - arr[i - 1],然后进行处理,处理次数依情况而定,最后再前缀和还原,这样时间复杂度就是O(m+n),线性,大大优化。
2025-01-11 16:52:31
753
原创 基础算法——前缀和
我们要算区间和,并且还要根据k的值来确定区间每个元素要进行k次方的处理,如果我们根据输入的k是多少然后再对区间元素进行处理。因为我们每次访问,虽然输入的l,r不同,但每次都要从头开始算次方和前缀和,这样多次的重复运算,就使得时间复杂度很高。的数量是相等的,按照题目中平衡串的定义,这个子串就是一个平衡串。数组的计算方式,在代码中通过如下语句来构建。的数量是否相等,也就是它们的差值是否为。表示的是从字符串的开头(也就是。的数量差值,其实就等于从开头到。的数量相等,是一个平衡串。例如,还是以上面的字符串。
2025-01-08 11:36:56
809
原创 进制转换——基础算法
将每一位乘以对应的十的次方数,再进行相加。第一步是把N进制数的每一位存入数组arr中。然后初始化十进制数x为0x 不断的乘以N,再加上N进制数的每一位数就可以得到十进制数字N了。
2025-01-05 16:03:54
358
原创 双指针的学习笔记
由于数字都是正数特性。当慢指针(左指针)移动的时候,区间和一定小,区间长也变小。当快指针(右指针)移动时,区间和变大,区间长变大。数组或者是字符串中,用来遍历。最美区间:输入两个数,n,s。找出大与等于s的最短区间。给出的样例都是升序的。
2024-12-31 10:18:19
424
原创 PTA数据结构编程题7-51,52,53
这道题目总体思路是先遍历两个链表,然后处理剩余数组的元素,最后再把处理结果放入第三个数组中输出即可。如何遍历两个数组?用双指针i,j把小的元素先放入数组中,如果不等长,则是短的链表先走完,此时,同时遍历两个数组这件事情结束。然后是处理剩余的元素,为什么剩余了?因为长链表还没有走完但是短链表走完了,所以还剩下一些长链表里面的元素没有被处理。长的链表此时双指针的下标一定还小于数组的大小。由于是非降序数组,则是挨个放入,恰好从小到大排列。
2024-12-27 21:47:14
454
原创 PTA数据结构编程题7-1最大子列和问题
给定K个整数组成的序列{ N1, N2, …, NK},“连续子列”被定义为{ Ni, Ni+1, …, Nj},其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。本题旨在测试各种不同的算法在各种数据情况下的表现。
2024-12-26 16:10:02
794
原创 链表刷题笔记(题解出自灵茶山)
即两个指针初始化为头节点,都从头节点出发。先让快的指针先走n次,如此就跳过了n个结点。但是判断条件要注意。一个乌龟一个兔子,永远不可能相遇,当它们相遇的时候,就说明这是一个环形链表。然后,慢指针与快指针再同时往后移动,此时就能发现,慢指针指向的位置就是倒数第n个结点的前一个结点。这里还没有结束,如果链表只有一个结点。那么我们需要创建一个哨兵结点,在前面,这样就可以解决了。难点在于怎么找到要反转的头节点的前面一个结点。就是将反转与寻找链表的中间结点结合起来。我写的时候错写此条件,会造成错误。
2024-12-10 19:29:19
250
原创 题目:苹果P1580的做题笔记
得到k的值后,将第一天到某一天的累积的苹果数存起来,直到这个数字>=k值。然后运用二分查找的思维去寻找匹配的下标。
2024-12-05 10:30:09
376
原创 PAT乙级1003我要通过的做题笔记
得到“答案正确”的条件是:字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。根据题目中的规则,如果aPbTc是正确的,那么aPbATca也是正确的。
2024-12-03 11:30:30
1055
原创 C语言模拟实现简单链表的复盘
我在实现时,错误讲指针先赋值为NULL,这样的话会造成野指针错误。不是将指针赋值给一个变量然后++,是将指针赋值为下一个节点的指针。sizeof(struct LNode)更加严谨。头节点与其他节点的处理方式不同。
2024-11-27 21:16:25
504
原创 数据结构单链表,顺序表,广义表,多重链表,堆栈的学习
比如一个多项式,主要包括x的系数,x的指数,那么可以创建一个一维数组来存储它的系数和指数,用数组下标来表示。它的系数可以用数组下标对应的数组元素来储存。可是这样储存会浪费空间所以采用单链表形式来存储。即创建一个指针变量,存储元素地址与下一个元素的地址,这样就不会造成太多空间的浪费。
2024-11-26 21:59:32
206
原创 文件的读写
FILE* stdin - 标准输入流(键盘)FILE* stdout - 标准输出流(屏幕)FILE* stderr - 标准错误流(屏幕)任何一个C程序,只要运行起来就会默认打开三个流。
2024-11-20 21:04:59
237
原创 相向双指针的两数之和,三数之和
returnSize是一个指向整数的指针。这个指针的作用是让函数告知调用者返回结果的大小。在这个函数中,函数将*returnSize设置为2,表示返回的结果数组(由twoSum函数返回的数组)的长度是2,其中包含了找到的两个数在numbers数组中的下标(从1开始)。p为一个储存两个整型的数组的首元素的指针。返回这个指针,就可以通过它找到我们存储在其中的两个下标。numberSize代表数组元素的个数用于确定双指针的取值范围。numbers指针代表数组首元素的地址,target代表我们要寻找的两数的和。
2024-11-19 14:42:53
397
原创 枚举,联合
define 定义的量在调试时和肉眼看到的代码不一样struct stint a;char c;//4char c;//共用int main()union Un u;u.c = 0x00;//?return 0;
2024-11-16 21:37:09
173
原创 qsort函数的模拟实现
int(* cmp)(const void* e1, const void* e2)//函数指针-比较函数。void qsort(void* base,//你要排序的数据的起始位置。size_t width,//待排序的数据元素的大小-单位是字节。size_t num,//待排序的数据元素的个数。
2024-11-16 19:34:27
185
空空如也
纯软和嵌入式该怎么选择?
2024-10-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人