代码随想录01(数组篇)
这也是我第一篇技术博客,记录我一开始有多菜!😭😭😭最近准备认真开始求职嵌入式软件工程师,开始刷数据结构与算法,花了两天的时间把这个数组篇章刷了一遍。我绝对不敢说自己精通C语言!🤦♀️我还要时不时的打开菜鸟C语言网站复习某些函数,OMG!要复习的要学的还有很多啊!不过认识到自己的不足的同时,更重要的是学会了很多方法。虽然也要花3-4个小时来学习,但是难度水平是渐进的,我是属于又痛苦😭又爱😍的感觉。痛苦的是很多题目我题目都看不懂,炸锅了,爱的是学会了,会感觉,我靠,这么屌炸天的想法是发明的!让我学到了!特别是今天刷的那道数组系列最后一道的“开发商购买土地”,其实核心思想是前缀和的求解,不过是在二维度的数组。在这道题之前,也是如此,那道一维度的数组叫求“区间和”,用的方法也是前缀和。我发现自己在细节上会有所欠缺,比如到底是赋值int i=0;还是int i=1;这个问题我问了ai老师,它告诉我,比如求每一行的行值就等于0,因为是从0开始的。然后如果是求前缀和,就等于1,因为是第一个值就赋在数组下标为0里,所以不需要从0开始。还有昨天学的一个双指针和滑动窗口法我觉得也很有意思,其实我个小菜菜连卡尔讲的多for循环暴力破解的思想都不会,属于感觉完蛋了,但是得好好学的复杂情绪了!好了,继续讲我感觉学的内容吧,先讲双指针,昨天的题目“二分查找”、“移除元素”、“有序数组的平方”这三道题都是用了这个思想,我其实昨天就很纳闷一个问题,这些算法都是谁想出来?我就是开发了n遍大脑都想不出一个。不过我想这个归根结底是与数组的特性相关,就是电脑分配了连续的内存空间给数组,想要删除中间的某一个数组值,只能是覆盖。还有那个有序数组的平方,我感觉其实和二分查找也差不多,因为最大的值都会在两端,还有这里题目,我复习了一下如何新建数组,复习了静态数组和动态数组的,还有我又加深了对堆内存和栈内存的理解。“长度最小的子数组”这道算法题则是用了我从来没接触过的滑动窗口,其实感觉和双指针也差不多,也是细细思考很有意思的一个方法,先找到sum>=target的区间,再去不断缩小,而且在这个里面我犯了个思维误区,我以为只要从左到右最快找到一个就好了,但是题目要求的是最小,最小的也有可能在后面,这在代码编写上就会有所不同。静态数组就是栈内存上的,当函数调用结束,程序会自动释放。而动态malloc创建的数组则需要手动free释放堆内存空间。好像涉及嵌入式八股文了,不过后面慢慢来吧。说实话,每天3或4道算法就够呛了,累成狗了!还有循环不变量,这个思想卡尔是一步步的深入的,关于这个数组的区间选择很重要的,到底是左闭右闭还是左闭右开,都需要去思考,就在那道题目“螺旋矩阵II”看题目都感觉很复杂,后面卡尔强调的循环不变量,用这样的想法去思考,好像也没这么难了。下次博客的选择是代码随想录网站的链表,明天还得重刷一遍我觉得需要多刷几遍的题目,这知识是只停留在大脑皮层,一晚上就溜走了,链表章节预计需要2-3天刷完,到时再做一次总结吧!