给你一个数组
nums
和一个值val
,你需要原地移除所有有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用
O(1)
额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解决思路:双指针
题目中要求我们删除数组中值为val的元素,所以输出数组的长度是一定小于等于输入数组的长度。所以我们可以把输出的数组直接覆写在输出的数组上,就可以使用双指针操作。
- 定义两个指针,快指针 fast 和慢指针 slow
- 快指针指向将要被处理还没处理的元素,慢指针指向下一个要赋值的位置
- 如果快指针指向的元素不等于val,它一定是输出数组的一个元素,将快指针指向的元素位置赋值到慢指针,然后两个指针同时++
- 如果快指针指向的元素等于val,它就不再输出数组里,此时慢指针不动,快指针++
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}