既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
**法一:**依次挪动数据进行覆盖
从第一个数据开始进行依次遍历,如同示例1,依次遍历数组,找到移除的元素2就把后面的数据往前挪动进行覆盖,如图所示:
此法有个缺陷,题目中明确指出使用空间复杂度O(1)的方法解决此问题,而此法的空间复杂度刚好为O(1),可以解决,不过考虑周全些,时间复杂度在情况最坏时为O(N2),出现全是val的情况,将会挪动n-1+n-2+……出现了等差数列,时间复杂度为O(N2),此法不是最优,换。
**法二:**双指针1.0
依次遍历原数组,看是不是val,把不是val的值,拷贝到新数组,此法的时间复杂度是O(N),空间复杂度也是O(N),可是题目明确指出空间复杂度要为O(1),所以此法不行,但是仔细想想,如果继续用此法双指针,但是不另开数组,就在原数组上改动可否呢?,由此引出双指针2.0
**法三:**双指针2.0
此法是在法二的基础上进行的升级,法二需要开辟额外数组,此法直接原数组改动。首先定义两个变量src和dst为0,都作为数组nums的下标,依次遍历src看nums[src]是否为val,若不是,将其赋给下标dst,再src++,dst++。若nums[src]=nums[dst],则只把src++,dst不动,最后再把长度dst返回即可。
- 代码如下:
int removeElement(int* nums, int numsSize, int val){ int dst=0; int str=0; while(str<numsSize) { if(nums[str]==val) { str++; } else { nums[dst]=nums[str]; dst++; str++; } } return dst; }
2、删除有序数组中的重复项
- 链接直达:
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
- 题目:
- 思路:
双指针(不额外开数组)
此题和上题类似,同样可以采用双指针,并在原数组进行改动,只需要定义两个变量dst和src作为数组nums的下标,但此时做出小变动,把src从下标1开始,而dst从下标0开始。让nums[src]每次和它前一个也就是nums[src-1]相比较,如果相等,则src++,若不等就把nums[src-1]赋给nums[dst],再dst++,src++。
注意:
执行完上述操作后,还存在一个问题,那就是没把src的最后一个下标的值放到nums[dst]里头去,就如同本题的示例,当src走到倒数第二个值3的时候,和前一个3相等,此时需要++src,现在nums[src]就是4,和前一个值不相等,把3赋给nums[dst],此时src再++到空了,没有数据和4比较了,越界,所以4就漏掉了。在如同当后面2个数字同为3的时候,因为一直相等,src同样+到空,3同样漏掉,所以无论哪种情况,都要把最后一个数字移到nums[dst]上
- 画图演示:
- 代码如下:
int removeDuplicates(int* nums, int numsSize){ int dst=0; int src=1; while(src<numsSize) { if(nums[src]==nums[src-1]) { src++; } else { nums[dst]=nums[src-1]; dst++; src++; } } nums[dst]=nums[numsSize-1]; dst++; return dst; }
3、合并两个有序数组
- 链接直达:
- 题目:
- 思路:
**法一:**memmove + sort排序(冒泡、qsort等)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
5%以上C C++开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新