数组 - 27. 移除元素(C#和C实现)
题目描述
给你一个数组 nums
和一个值 val
,你需要原地移除所有数值等于 val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解题思路
可以使用双指针的方法来解决这个问题。
- 定义两个指针
left
和right
,初始时分别指向数组的开头。 - 遍历数组,如果当前元素不等于目标值
val
,将其复制到nums[left]
的位置,并将left
指针向后移动一位。 - 遍历结束后,
left
指针的位置即为新数组的长度。 - 返回
left
作为结果。
辅助理解
假如你站着自由女神像下面,左手上抓着赤橙黄绿青蓝紫7个气球,然后你对面站着一个小女孩,手上也拿着一个橙色的气球,小女孩慢慢走了过来,你蹲下去,对小女孩说:小妹妹你喜欢气球吗,小妹妹我送你一个和你手上一样的橙色气球好吗?我有个要求就是,你只能在我左手上进行选择,不能把气球放到右手
- 你左手抓的气球 == 数组中的元素,小女孩手上的气球 == 目标的值
- 两个指针
left
和right
相当于气球的线(可以理解为指针),通过线能找到气球(可以理解为指针能找到值)再深究点就是堆栈了,这里不讲了 - 定义了两条线
left
和right
都是从第一个气球开始,left
的职责就是返回最终数量,right
的职责就是寻找匹配的气球,如果气球颜色不匹配,那就跳过,left++
,然后继续寻找right++
,如果要是颜色匹配上,那就right++
- 返回最终数量
left
解题实现
C#
public int RemoveElement(int[] nums, int val)
{
int left = 0;
int right = 0;
while (right < nums.Length)
{
if (nums[right] != val)
{
nums[left] = nums[right];
left++;
}
right++;
}
return left;
}
C
int removeElement(int* nums, int numsSize, int val) {
int left = 0;
int right = 0;
while (right < numsSize)
{
if (nums[right] != val)
{
nums[left] = nums[right];
left++;
}
right++;
}
return left;
}
复杂度分析
- 时间复杂度:O(n),其中 n 为数组的长度。需要遍历一次数组。
- 空间复杂度:O(1)。只使用了常数个额外空间。
参与点评
读者朋友们,如果您在阅读过程中,对文章的质量、易理解性有任何建议,欢迎在评论区指出,我会认真改进。