题目描述:
思路1:定义一个指针str指向首元素,遍历数组nums,如果*str==val,则将该元素后面的所有元素前挪一位覆盖该元素,若*str!=val,则str++
然而我们来看看这种写法的时间复杂度:
我们可否将时间复杂度优化一下呢?由此想到第二种思路
思路2:创建一个新的数组,变量数组nums,如果元素值不等于val就放入新的数组中,最后再把arr中的值拷贝到nums中
然而虽然这种写法的时间复杂度度优化到了O(N),但空间复杂度却是O(N),不符合题目要求,由此想到第三种思路
思路3:
1.定义两个下标src=dst=0
2.src负责找不等于val的值并把值赋给dst对应的元素,src++ dst++定位下一个元素
3.最后返回dst的值即为元素个数
最终代码实现:
int removeElement(int* nums, int numsSize, int val)
{
int src=0,dst=0;
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[dst]=nums[src];
dst++;
src++;
}
else
src++;
}
return dst;
}