27移除元素–双指针(快慢指针)
移除元素这道题看起来很简单,但其蕴含的快慢指针的思想十分重要。
-
双for循环(暴力法)-- O( n 2 n^2 n2)
使用第1个for循环 i 遍历数组所有元素
使用第2个for循环从 i 开始进行数组元素的前移
-
双指针法(快慢指针法)-- O(n)
使用双指针节省一个for循环
如图,使用fast代表原数组,slow代表更新后的数组。
首先,利用fast进行数组的遍历。若当前扫描的值不是要删除的值,则将当前值赋值给slow指向的空间,保证原数组与更新后数组数值的同步。之后,slow值加1,fast加1,指向下一个空间。
若当前fast指向的值是要删除的值,则不将当前值赋值给slow。此时,slow不改变,仅将fast加1,从而达到“移除元素”的效果。
注意:算法执行完毕后,数组真实长度没有改变,仅是由待移除元素后面的值将其覆盖了。
int removeElement(vector<int>& nums, int val) {
int slow = 0, fast = 0;
for(; fast < nums.size(); ++fast){
// 如果fast值不是要移除的值,则将当前值赋值给slow,slow++
// 如果fast值是要移除的值,则仅对fast++,当前值被移除
if(nums[fast] != val)
nums[slow++] = nums[fast];
}
return slow + 1;
}