双指针问题

问题讲解(leetcode 283移动零问题)

1.问题解析

  给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

注意点:

  • 原地操作代表不开辟新的数组

  • 保存非零元素的相对位置

2.算法原理

1定义两个”指针“ 这两个指针不代表真正意义上的指针 能控制需要操作的数就行 如需要操纵数组的号 把数组的下标当作”指针就行“

2.指针一cur:用于遍历数组
指针二dest:已处理的区间内,非零元素的最后一个位置

3.下面我们可以将数组划分为三个区间:
[0,dest]:为已经处理过的区间
[dest+1,cur-1]:为零元素所处的区间
[cur,n]:为未处理的区间(n代表这个数组下标的最后一个数)

3.编写代码

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cur=0;
        //最开始还没有处理过的数字所以dest定义为-1
        int dest=cur-1;

        while(cur<nums.size())
        {
            if(nums[cur]==0)
            {
                cur++;
            }
            else
            {
            	//找到合适的位置需要先++
            	//因为当前dest的位置存放的是已经处理过的数字
            	//处理过后cur要继续向后遍历
            	//但交换的是当前cur位置的数 所以使用的后置++
                swap(nums[++dest],nums[cur++]);
            }
        }
    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值