27. 移除元素
描述
给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
分析
- 若此题目允许开辟新数组,直接遍历一遍数组,把符合条件的加入即可。时间复杂度和空间复杂度都是O(N)的。
- 但是此题限制开辟数组,所以必须要在原数组上进行操作。
解法
正解:使用快慢指针
慢指针:记录下一个元素存放的index值。
快指针:用于比较数组元素,若nums[fast++]==val ,则continue。若nums[fast]!=val,则nums[slow++]=nums[fast++]。
时间复杂度O(N),空间复杂度O(1)。
代码
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];
}
}
return slow;
}
总结
快慢指针是指针和链表题常用方法,旨在快慢指针各司其职,相互配合,从而得出答案。