27移除元素--双指针(快慢指针)

27移除元素–双指针(快慢指针)

移除元素这道题看起来很简单,但其蕴含的快慢指针的思想十分重要。

  1. 双for循环(暴力法)-- O( n 2 n^2 n2)

    使用第1个for循环 i 遍历数组所有元素

    使用第2个for循环从 i 开始进行数组元素的前移

  2. 双指针法(快慢指针法)-- O(n)

    使用双指针节省一个for循环

    27移除元素--双指针(快慢指针)_第1张图片

如图,使用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;
 }

你可能感兴趣的:(算法,算法,数据结构,leetcode)