- 博客(42)
- 收藏
- 关注
原创 领略算法真谛:差分
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!差分前缀和与差分的核⼼思想是预处理,可以在暴⼒枚举的过程中,快速给出查询的结果,从⽽优化时间 复杂度。是经典的⽤空间替换时间的做法。学完差分之后,⼤家会发现,前缀和与差分是⼀对互逆的运算。
2025-02-10 23:13:53
1086
1
原创 领略算法真谛:前缀和
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!
2025-02-09 09:44:24
1050
原创 数据结构漫游记:队列的动态模拟实现(C语言)
你别说还真有如果我们定义一个指针一直指向尾结点呢,之前我们实现链表时都有这个想法,但因为尾部进行删除时指向尾结点的指针不能找到他的前一个结点,但我们如果实现队列,根本不需要对尾部进行删除操作,所以我们定义一个始终指向尾结点的指针,然后进行尾插操作很显然时间复杂度就降到了O(1)了。我们如果用遍历来实现获取元素个数,那么时间复杂度就又成了O(n)呢,如果这个操作执行的次数少到也无妨,但如果执行的次数多我还是建议定义结构的时候多定义一个变量size,然后初始化,入队,出队时多进行一下操作即可。
2025-01-18 15:43:39
844
1
原创 数据结构漫游记:动态实现栈(stack)
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let'sgo!相信大家对于栈那一块还是比较了解,在学校c语言时,一定了解过函数栈帧之类的东西,我们就来用c语言来实现一下这个数据结构一.栈的认识栈(stack)作为一种数据结构,它遵循一个准则就是后进先出(或者是先进后出),就像一个箱子里先放了的东西要最后才能拿出来。
2025-01-17 14:38:14
842
原创 数据结构漫游记:动态带头双向循环链表
SlistNode;我们既然有头结点,那么我们进行关于链表接下来的操作时,要先初始化一个头结点,而创建一个结点一定会向内存申请空间,我们先分装一个申请结点的函数吧。
2025-01-16 00:12:36
1069
原创 题山采玉:环形链表(I)(II)
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!题目来源我们先来解决第一个。
2025-01-15 00:13:38
440
原创 题山采玉:相交链表
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!题目很长,但总结也就几句话,给了两个链表,判断链表是否相交,并返回交点,有两种相交:1.2.这种情况是两个链表相同。
2025-01-15 00:11:10
303
原创 题山采玉:链表的回文结构
生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。给出了一个结点个数小于等于900的链表,判断它是否是回文结构,所谓的回文结构,就是将结构逆转后也相等,比如abccba这之类的。这个方法很难想到,但能实现问题,我们先找到链表的中间结点,在题山采玉专题里面有这样一道题:链表的中间结点来自力扣。链表判断是否为回文,我们不好判断,那我们将链表中的数据存储在数组之中那不就好办了吗?已经出了文章了,请多多支持。
2025-01-14 09:08:34
776
原创 题山采玉:链表的中间结点
定义一个slow和fast都指向head,然后遍历链表,直到fast==NULL,然后fast=fast->next->next,slow = slow->next,我们发现,每次fast都比slow多移动1次,当fast移动到n个结点时,slow就移动到了n/2了,此时返回slow指向的结点就可以了。定义一个count来记录链表的结点数,通过遍历链表实现,然后再次遍历一般,找到第(count+1) / 2的那个结点,也就是头结点移动count次。此时fast为空,即fast ==NULL;
2025-01-14 09:08:02
261
原创 题山采玉: 反转链表
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。然后我们将n2指向的结点的next指向n1指向的位置,然后n1 = n2,n2 = n3,n3 = n3->next,相当于整体向右移动。我们就发现,链表就神奇的逆序了,注意这里结束条件应该是n2等于0,然后n3这个当它已经为空的时候,就不能进行解引用操作了,要注意。我们定义三个指针,一个指向空,一个指向头结点,另一个指向头节点的下一个结点。给了一个链表,要求将它反转,并返回头结点。
2025-01-13 16:22:09
286
原创 题山采玉:合并两个有序链表
生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?的方二相似,也可以用双指针来解决,cur1遍历list1,cur2遍历list2,phead,ptail表示新链表,谁小就尾插谁在新链表上。如果要在原链表中实现合并,不是不行,只是有点麻烦,这题和我们之前遇到的。给了俩个有序的链表,然后将他们合并,返回合并后的链表。
2025-01-13 15:24:20
252
原创 题山采玉:移除链表元素
题目理解:嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!本题来自力扣题目理解:题目很简单,就是将链表中为值val的结点删除。思路讲解:1.原地修改我们在单链表中要删除元素,必须要找到前一个结点,不然没法进行删除操作,我们就可以定义一个指针cur来遍历链表,而prev来标记cur的前一个结点。
2025-01-13 14:58:33
491
原创 领略算法真谛:高精度
这里定义的全是全局变量,方便不用初始化,数组a,b代存储的是两个加数逆序存储后的一个一个位 (由低位到高位存储)而数组c存储的是a加b的和la,lb,lc是数组abc的大小(有效存储个数);
2025-01-12 17:08:25
915
原创 题山采玉:合并两个有序数组
什么辅助数组啊,通俗一点将两个数组合并到这个新数组之中,而要实现这一切,不得不使用三指针,定义三个指针,分别指向三个数组的首元素,比较前两个数组的大小,谁小谁移动到新数组中,基本思路就是这样,大家注意看代码实现的时候有很多小细节,一个细节没注意到,可能就完蛋了,够你调试半天的了。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。题目很简单,有两个升序的数组,一个大小为m+ n但后n个不存储有效信息全是0,讲两个数组以升序合并到一起,并且合并到第一个数组。
2025-01-06 00:07:23
403
原创 题山采玉:(三指针)颜色分类
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!题目来源:力扣。
2025-01-05 17:48:50
645
原创 领略算法真谛:双指针
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!本章采录我的四篇专栏。
2025-01-03 13:39:08
1021
原创 题山采玉:寄包柜
题目很长一段,超市有n个快递柜每个柜子又有不同数目的格子,每个格子里又要放东西,题目要求输入n和q,n表示快递柜子数,q表示接下来要进行的操作次数,q之后当输入的数字为1时,在输入i,j,k要求再第i个柜子里的第j个格子放入k个物品。如果创建二维数组a [ 1e5 ][ 1e5 ],内存太大,不能实现,但我们如果创建一个数组里面存储的是vector变长数组,当j大于vector里面的空间时我们可以使用resize进行扩容操作,相信大家知道这个之后就很容易实现了,快去试试吧。但里面还存在一些细节下文见。
2025-01-02 20:41:15
406
原创 题山采玉:询问学号
生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。有n个同学每个人都有属于自己的独特的学号,他们按照一定的顺序进教室。现在上课了老师有m次机会询问第i个进教室的人的学号是什么。输入n和m,还有n个同学的学号(依次进入的)输出m个人的学号。这是一个简单的问题可以用数组来实现,由于我们之前学习了vector,所以我们就使用vector来实现这个简单的问题,将m个同学依次的学号存储在vector中。
2025-01-02 19:48:53
147
原创 数据结构漫游记:初识栈(stack)
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。该功能特别简单只需要n--即可,有人问为什么不将n下标位置的数据清空呢,我们只访问n之前的元素,根本不会访问到那个已经删除的元素。我们用一个很大的数组来存储栈里面的元素,同样的在下标为0 的位置不存储任何信息,用n来记录栈中元素的个数。stack是C++STL库里面的一个容器,可以实现栈。里面的库函数和上述模拟实现的一样。在了解了静态实现顺序表之后来实现栈应该是很轻松的。栈顶元素:在栈最上面的元素。
2025-01-01 18:45:43
583
原创 数据结构漫游记:静态双向链表
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。总体来说双向链表在单链表学习的基础上来学习就是很简单了,有些操作时间复杂度不是O(1)就不进行实现了,实现起来也不难,但不会经常遇到,就这样吧!上期介绍了单链表,我们知道单链表在插入删除等部分,要实现这些功能要找到上一个结点会很困难,针对这一困难,我们可以再设置一个数组来存储该结点的上一个结点。好了到了双向链表的优点地方了,在这里找到前一个元素就轻轻松松了。时间复杂度O(1)。时间复杂度O(1)。
2024-12-29 13:56:15
368
1
原创 题山采玉:(双指针)盛最多水的容器
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。假如我们枚举成这样以后,左边这条线比右边这条长,如果将左边这条线向右移动,不仅宽度会变小,长度再大也依据右边这条短的为主,而且宽度也变小了,我们就没有枚举下来的必要了,这时我们可以试试将右边这条线向左移动,继续进行上述判断,直到两条线重合。题目给了关于线的长度的数组,任意选两个线,判断容器最大是多少,容积等于下标相减后乘以两条线最短的一条。这里等会就不编写代码了,判断一下时间复杂度很明显是O(n^2).
2024-12-24 12:40:12
594
2
原创 题山采玉:(双指针)快乐数
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。10*81 = 810,假设我们再次进行811次操作,一定会出现重复的数字,因为一次操作一定会产生一次结果,并且他们产生的结果一定小于等于810.这道题,我们可以使用同样的思路,只不过当fast等于slow时判断重复的数字是不是1即可。假如这个数字最大值是int的最大值应该是10位数字我们假设是9999999999它进行一次操作后是。结果要么是1要么无限循环。我们换个思路,最后结果是1那也算是无限循环1,
2024-12-24 11:29:24
539
原创 题山采玉:(双指针)复写零
我们之前学习过的vector,可以使用里面的insert内置函数来解决,当元素为0时就在其后面插入一个零,但要求数组的元素个数不变,我们可以先记录没开始遍历时的元素个数,然后遍历数组之后进行尾删操作,即可。cur是不是改指向最后要修改的位置及看方法二中cur最后指向的位置。如果我们定义的两个指针都指向前面的元素从前往后去遍历,遇到0就改两个,你就会发现我们会把还未遍历的元素修改了所以我们得从后往前遍历。而cur指向的位置是0时,将dest的值改成0,移动一位,再改成0 然后curdest移动一位。
2024-12-23 15:23:33
946
1
原创 题山采玉:(双指针) 移动零
可以将数组分为这三部分,我们可以将cur先定义为-1,当nums[ i ] == 0的时候,就可以直接i++跳过把这个元素给0部分就可以了,而当nums[ i ]!= 0时,我们得将 nums[ i ]移动到cur的后面,而非0范围会变大,所以我们得将cur++,然后将nums[ cur ] 和nums[ i ]相交换就可以实现了。这种方法的思想也是很重要的,我也会实现一下。接下来就是重头戏了,双指针,这里的双指针并不是真正的指针,而是用变量来标记元素的下标,作用类似于指针,所以叫他指针。
2024-12-23 13:13:46
407
1
原创 题山采玉:约瑟夫问题
接着,再越过k-1个人,并杀掉第k个人。我们要删除3号元素,但我们在3号元素停下时,很难找到前一个结点,要么再定义一个指针,或者使用双向链表,这些方法实现都很麻烦,不如我们再2号元素停下来,题目叫走3次,但我们只走2次就够了,但打印时不要忘记要通过下标打印下一个结点的数据。围成一圈很明显要使用循环的数据结构,我们目前学习的循环结构很容易想出来循环链表,循环链表的实现,有两种,一种静态一种动态的,但动态的复杂程度明显要大于静态的,运行时间也大大大于静态 的,所以我们这道题使用静态来实现是一种好方法。
2024-12-20 20:49:04
817
3
原创 数据结构漫游记:静态链表的实现(CPP)
这个功能要传入的数据是某个位置的下标,如果传入的是数据,也得转化为下标来计算,这个位置之后的插入就和头插的执行过程差不多,这里就简单带过咯。这里有一个弊端,当存储两个相同的数时,mp数组就不知道存储谁的下标,当没有重复的数据时使用这个方法的时间复杂度是O(1),大大的优化。我们动态实现链表时每次都会为新的链表申请空间,会搞得很麻烦代码量也很高,运行的时间也会很高,但静态实现完美的解决了这个问题。这是有人就会问了你这个ne数组是不是多余了,我靠一个一个下标就能找到下一个元素啊,根本用不到ne数组啊。
2024-12-20 13:03:33
1417
2
原创 C++入门小馆:初识sort函数
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。这个比较函数的返回类型设置为布尔类型,通过接受两个参数,运用<或>运算符来实现功能,为真返回ture,为假返回false。这里面first表示开始位置,last就是结束位置了,这里可以传迭代器或者是指针类型的变量。第一个类型少一个参数,实现的是升序的排序,如果你想实现降序,那就得使用第二个类型了。注意一下这里排序string类型时排序是按照ASCII码值来升序排序的。就要用到下列这个类型的sort函数了。
2024-12-18 16:11:02
580
1
原创 数据结构漫游记:初识vector
vector其实是一个容器类似于string,有些地方把他叫做可变长数组。vector的底层是一个会自动扩容的顺序表。
2024-12-17 12:39:38
1109
1
原创 C++入门小馆:函数的重载
有人就有疑问了,这个函数怎么可以输入三个或者两个参数,我们自己写函数时,不是要定义好传入的参数个数吗?这里其实就用到了函数的重载,我们可以写两个同名的函数,他们可以在返回值传入的参数个数类型以及先后顺序上存在差异,编辑器会根据你传入的参数的各个特性自动匹配适合的类型来实现你想要的功能。之前我们学习了很多函数,比如字符串string的中的一个函数getline可以用来输入带空格的字符串,也可以指定结束字符类型。这里只是实现了整形类型的加分,如果有一天我们想计算浮点型的加法运算呢?比如我们写个Add函数。
2024-12-15 23:48:57
619
3
原创 C言雅韵集:字符串函数
以下函数都是库函数,要使用下列函数时要引用头文件求字符串长度strlen长度不受限制的字符串函数长度受限制的字符串函数字符串查找错误信息报告strerror字符操作一.strcpy这个函数将一个字符串中的内容拷贝到另一个字符串,要求被拷贝字符串的字符串长度要小于目标字符串,不然就会拷贝失败,编辑器会报错。下面是实现my_strcpy。
2024-12-14 22:21:47
357
3
原创 C++入门小馆 :string
size()函数包含在string中,是个成员函数,所以在使用时要用 . 点运算符,size也如它的英文一样,可以用来计算string类型的变量的字符个数。string是c++中的分装类型,不同与内置类型,所以在使用string和它包含的各个函数时要使用这个头文件。注意返回的是size_t类型,如果未找到会返回size_t转换后的-1,就是个很大的数,这里的arr1和arr2表示的是首元素地址,是常量,常量是不能进行赋值操作的。这是getline的原型,这里的istream是标准输入流,
2024-12-14 21:55:10
1152
2
原创 数据结构漫游记:顺序表的实现C/C++
那我们有两个选择,要么用很大的数组来当线性表,这就是一个静态的顺序表了,还有一种做法,在c语言中我们可以利用malloc或者ralloc来申请空间来实现,具体要使用那个我们之后慢慢说。这里注意无论是顺序表还是链表,他们在逻辑上都是线性的,但在物理上却不一定哦,今天我们要介绍的顺序表,无论是在逻辑上还是物理上都是线性的.定义好了这玩意,又要进行我们的增删查改了,这个就是数组的插入等问题,应该对于很多有一定基础同学来说是很简单了,我这里就不一一赘述了。尾删应该算是很简单的吧,只需要将元素个数减减就可以了。
2024-12-09 23:36:28
1013
2
原创 数据结构漫游记:动态链表的实现
头插头插,我们得先为我们头插的结点申请一块内存区域,而我们了解到可以使用静态内存和动态内存,而在找工作这个目的上我们使用malloc申请一个动态内存要优于使用特别大的数组来使用静态内存,如果你只想在竞赛中鹤立鸡群那我就特别推荐您多去了解一下静态这个方法了,因为静态它无论是在运行速度还是代码的难易程度上都占了很大的优势,但它会浪费很多内存。我们知道下一个数据的地址是指针类型,而数据的类型就比较多了,显然用数组来存储是不合理的选择,要存储不同类型的元素,唉在c语言是不是有个结构体可以实现这个问题呢。
2024-12-08 16:22:00
1124
5
原创 C言雅韵集:柔性数组
也许你从来没听说过柔性数组这个概念,但他确实是存在的。C99中,结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组成员。包含柔性数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。可见方案二实现的malloc次数多余方案一,会实现内存碎片,利用率不高,不利用访问速度。sizeof返回的这种结构大小不包括柔性数组的内存。结构中的柔性数组前必须至少有一个其他成员。不用柔性数组实现上述操作。
2024-11-23 16:56:52
462
1
原创 C言雅韵集:大小端
将一个整形a初始化为1,1的16进制为0x00 00 00 01,如果是小端存储,首地址就是01,将整形指针强制类型转化为char*类型,打印出来如果为1就是小端,反而就是大端。假设有个整形他的16进制为0X11 22 33 44占四个字节,那我们该怎么将这个整形存储在内存中呢,假如下面是我们的内存有低地址和高地址。把一个数据的高位字节序的内容放在低地址处,把低地址序的内容放在高地址处,就是大端字节序存储。把一个数据的高位字节序的内容放在高地址处,把低地址序的内容放在低地址处,就是大端字节序存储。
2024-11-22 17:14:14
397
原创 C言雅韵集:结构、联合,枚举
数组可以用来存放一类相同元素的集合,而接下来要讲的结构体,它的元素(在c语言中称为它的成员)可以是不同类型的,而且每个成员都有名字。在其他一些语言中把结构称为记录,把结构的成员称为字段。如果要存储数据项中的数据,比如要存储一个学生的信息身高,体重,性别,年龄等,不同类型的变量时用结构是中再好不过的选择。初始化的值必须按照结构成员的顺序来显示并且用花括号框着。结构的成员是按照声明顺序存放在内存中的。2.结构变量的初始化。
2024-11-19 22:32:20
123
原创 C++入门小馆:C与C++之异
在公司AB各有一名叫张三的员工,一名男的一名女的,而有一天来了一名不速之客,他暗恋了张三很久终于鼓足勇气来到了公司楼下,不料楼上有两家公司,他在楼下大喊张三我爱你,这是公司A的张三听到了就很懵逼,我什么时候成gay了。而在c++中iostream相当于c语言中的stdio是c++中的标准输入输出流头文件,而cout就等同于c语言中的printf,
2024-11-18 18:32:53
475
1
原创 C言雅韵集:输出函数printf以及puts
它会将字符串输出到标准输出设备(通常是屏幕),并且会在输出的字符串末尾自动添加一个换行符\n。格式可用%d,%f等表示但一个%X必须对应一个参数,不能同时两个%X却只有一个参数,你可能想表达两个%X都是这个参数但在C语言中这样是行不通的。可以同时输入多组数据,灵活的控制输出的格式,如控制整数的进制、浮点数的精度。printf是一个格式化输出的函数,它可以输出各种类型的数据,并且能够按照指定的格式进行输出,例如。printf和puts都是c语言的库函数,都可以输出的函数但他们也存在着一定的区别。
2024-11-06 13:27:26
676
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人