给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解法1:暴力解法
第一个循环找到目标元素,第二个循环把后面的元素往前移动一位,向前覆盖。
注意:在后面的元素往前覆盖后,i要自减。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i=0;i<size;i++)
{
if(nums[i]==val)
{
for(int j=i+1;j<size;j++)
{
nums[j-1] =nums[j];
}
i--; //因为后面的元素都往前进了一个位置,所以要自减1,再次判断新上来的元素
size--;
}
}
return size;
}
};
解法2:快慢指针
快指针判断当前指针指向的是否是目标元素,如果不是,就将该元素赋值给慢指针指向的位置,慢指针向右移动一个位置。快指针指向的如果是目标元素,就不赋值给慢指针,慢指针也不动,快指针继续向后移动,进行下一次判断。
可以将慢指针的更新理解为删除目标元素后的新列表。
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int size = nums.size();
int slowindex=0; //慢指针
for(int fastindex=0;fastindex<size;fastindex++)
{
if(val!=nums[fastindex]) //如果快指针指向的元素不是目标元素
{
nums[slowindex]=nums[fastindex]; //就给慢指针赋值新元素
slowindex++;
}
}
return slowindex;
}
};
出自:代码随想录