[Algorithm][双指针][移动零] + 双指针原理

  • 本专题我会和大家一起刷算法,尽可能给详细思路和算法代码~

0.原理讲解

  • 常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是快慢指针

1.对撞指针

  • 对撞指针:⼀般⽤于顺序结构中,也称左右指针
    • 对撞指针从两端向中间移动
      • ⼀个指针从最左端开始
      • 另⼀个从最右端开始
      • 然后逐渐往中间逼近
    • 对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环)
      • left == right -> 两个指针指向同一个位置
      • left > right -> 两个指针错开

2.快慢指针

  • 快慢指针:基本思想是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动
    • 这种⽅法对于处理环形链表或数组⾮常有⽤
      • 在⼀个环中,快指针总是会追上慢指针的
  • 其实不单单是环形链表或者是数组,如果研究的问题出现循环往复的情况时,均可考虑使⽤快慢指针的思想
  • 快慢指针的实现⽅式有很多种,最常⽤的⼀种就是:
    • 在⼀次循环中**,每次让慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢**

1.移动零

  • 题目链接
  • cur = 0:从左往右扫描数组,遍历数组
  • dest = -1:已处理的区间内,非零元素的最后一个位置
    • 最开始不知道非零元素在什么位置
  • 两个指针将数组划分为三个区域
    • [ 0 , d e s t ] [0, dest] [0,dest] -> 非0
    • [ d e s t + 1 , c u r − 1 ] [dest + 1, cur - 1] [dest+1,cur1] -> 0
    • [ c u r , n − 1 ] [cur, n - 1] [cur,n1] -> 待处理
  • 实现思路:cur从前往后遍历过程中
    • 遇到0元素:cur++;
    • 遇到非0元素
      • swap(dest + 1, cur);
      • dest++, cur++;
void MoveZeroes(vector<int>& nums) 
{
    for(int cur = 0, dest = -1; cur < nums.size(); cur++)
    {
        if(nums[cur]) // 处理非零元素
        {
            swap(nums[++dest], nums[cur]);
        }
    }
}
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值