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

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

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

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

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

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

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

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

    3

如图,使用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;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值