大家好!这篇我给大家讲解一下有关顺序表的题目,是力扣上面的,希望对大家有所帮助。
移除元素难度:简单 OJ链接
解法一:
假设有这样的一组数组,val为2
我们可以写一个查找函数,来找val,找到后我们将后面的数据把val覆盖。过程如下:
代码如下:
//找到val的下标
int Find_val(int* nums, int numsSize, int val){
for(int i=0;i
当数组里全为2的时候,是最坏的情况,时间复杂度为O(N^2),空间复杂度为O(1)。
解法二:
把不是val的值,拷贝到新数组。然后把新数组里的数据拷回去。
这里的时间复杂度为O(N),空间复杂度也为O(N)(这里不符合题目要求,就不写了)。
解法三:
双指针。一个设为src,一个设为det。
1.当nums[src]不等于val,我们就将nums[dst]=nums[src],然后将src和dst都++一下。
2.当nums[src]==val,我们就将src++,dst不++。
此时,我们在按照第一条,2就会被3覆盖。
然后,src和dst都++。
按照第一条,nums[src]!=val,nums[dst]=nums[src]。
然后,src和dst都++
然后nums[src]!=val,nums[dst]=nums[src]。
然后,src和dst都++
当nums[src]==val,我们就将src++,dst不++。
可能有的人会问后面的0,4,2,怎么办?
我们可以看题目的意思返回移除后数组的新长度,不需要考虑数组中超出新长度后面的元素。
所以我们只需要返回dst的长度就行了。这样,我们就把不是val的值保留下来,是val的值给覆盖了。
代码如下:
总结:
如果大家认为我有哪些不足之处或者知识上的错误都可以告诉我,我会及时改正,也请大家多多包涵。如果大家觉得这篇文章有用的话,也希望大家可以给我关注点赞,你们的支持就是对我最大的鼓励,我们下一篇文章再见。



