移除元素

1
2
3
4
5
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

方法1

遍历数组,找到元素val。

val之后的元素全部左移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n=nums.size();
int i=0;
while(i<n){
if(nums[i]!=val) i++;
else{
for(int j=i;j<n-1;j++)
nums[j]=nums[j+1];
n--;
}
}
return n;
}
};

方法2 双指针优化

设置快慢指针f,s。

初始时值均为0。

如果nums[f]和nums[s]均不等于val,f++,s++

如果nums[s]为val,则停住,f++

当nums[f]!=val时,说明s与f之间的值只有val(可能一个可能多个)

此时执行替换操作。

替换完成后数组长度变为s

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n=nums.size();
int s=0;
for(int f=0;f<n;f++){
if(nums[f]-val){
nums[s++]=nums[f];
}
}
return s;
}
};