1. 题目描述
2. 思路分析
方法一:暴力删除,挪动数据覆盖。即遍历整个nums[ ]数组,遇到值等于val的元素,就将整个元素后面的所有元素都向左挪动一位。
时间复杂度:O(N^2)
空间复杂度:O(1)
方法二:时间换空间。额外开辟一个tmp[ ]数组。定义两个变量src和dst,src遍历nums[]数组,dst最开始指向tmp[ ]的最开始位置。将src位置不等于val的值插入到dst位置,然后再把tmp[ ]数组拷贝回去。
流程演示:
时间复杂度:O(N)
空间复杂度:O(N)
方法三:和方法二类似,但是直接在原数组操作。定义两个变量src和dst,src遍历nums[]数组,dst最开始指向nums[ ]的最开始位置。将src位置不等于val的值插入到dst位置。(也就是src在nums[ ]数组找不是val的值依次尾插)
我们也把这种算法叫双指针算法。
流程演示:
时间复杂度:O(N)
空间复杂度:O(1)
我们发现通过双指针算法大大优化了时间复杂度和空间复杂度!
3. 代码实现
我们这里进行时间复杂度和空间复杂度最优的方法三的代码实现:
int removeElement(int* nums, int numsSize, int val){
int n=numsSize;
int src=0,dst=0;
while(src<n)
{
if(nums[src]!=val)
{
nums[dst++]=nums[src++];
}
else
src++;
}
return dst;
}