题目链接:https://leetcode-cn.com/problems/remove-element
解题思路:
本题最简单的方法是采用双指针做法:
先创建两个变量dest和src指向第一个元素然后,当src不等于val时,让src往后走,并把src赋值给dest
直至出现src和dest都指向val时
在src指向非val之前,dest不变,src一直自增到不等于val的元素,然后将src指向的非val元素赋值给dest
src自增以后,dest自增以后,继续赋值
src自增以后,dest自增以后,赋值
src指向val,src自增,dest不自增,src不赋值给dest
直至src等于数组大小时,结束
代码如下:
//采用双指针方法最为简单,时间复杂度是O(n),空间复杂度是O(1)
//方法来源于创建数组(空间复杂度是O(n)),但是该题要求空间复杂度是O(1)
int removeElement(int* nums, int numsSize, int val) {
int dest = 0;
int src = 0;
//利用双指针将同一个数组内容改变
while (src < numsSize)
{
//当nums[src]不等于val时,把src里的值给dest
if (nums[src] != val)
{
nums[dest] = nums[src];
++src;
++dest;
}
//当nums[src]等于val时,直接跳过
else
{
src++;
}
}
//返回长度,而dest就是此时的长度
return dest;
}