双指针——移动零

前言:

双指针算法的适用场景:
数组划分
数组分块

题目

在这里插入图片描述

算法原理

定义两个指针
dest:已处理的区间内,非零元素的最后一个位置
cur:从左往右扫描数组,遍历数组
在这里插入图片描述
最终 确定下来三个区间
非零区间 零区间 待处理的区间
在这里插入图片描述

在这里插入图片描述
如何做到:cur从前往后遍历的过程中

  • 1,遇到0元素 cur++;
  • 2,遇到非零元素dest++,cur++;

补充:双指针的思想在快速排序中也有体现!

代码实现

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
       int cur =0;
       int dest =-1;
       while(cur < nums.size())
       {
           if(nums[cur])
           {    
                swap(nums[++dest],nums[cur]);
           } 
           cur++;     
       }
    }
};
  • 这里的时间复杂度 O(n) 空间复杂度O(1)
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晚安刘十三

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

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

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

打赏作者

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

抵扣说明:

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

余额充值