题目
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路
-
核心思路:原地移除等于val的元素,因此可以利用原数组前部作为不等于val的元素的存储空间。
-
使用双指针法,创建源指针src遍历原数组,指向当前待处理的元素。创建目标指针dst指向待赋值的位置。
思路如下图所示:
代码实现
- 如果当前元素不等于val,则存入作为存储空间的数组头部。
- 如果当前元素等于val,则跳过该元素。
int removeElement(int* nums, int numsSize, int val)
{
int src = 0; //从首元素开始判断
int dst = 0;
while(src<numsSize)
{
//src代表的元素不等于val
//说明需要保存到存储空间
if(nums[src] != val)
{
nums[dst++] = nums[src++];
}
//src代表的元素等于val
//说明需要删除,不需要保存
else
{
src++;
}
}
return dst;
}
复杂度分析
时间复杂度:N是数组长度,仅遍历一次数组,为O(N)。
空间复杂度:直接在原数组上修改,没有开辟新的空间,为O(1)。