【优选算法】 - 1.双指针技巧:移动零

引言

在今天的文章中,我们将探讨一个经典的算法问题——移动零。这个问题要求我们将数组中的所有零移动到数组的末尾,同时保持非零元素的相对顺序不变。我们将使用双指针技巧来解决这个问题,这是一种在处理数组或链表时非常高效的方法。
leetcode-移动零

问题描述

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

示例

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

解题思路

  • 双指针法:我们使用两个指针,一个快指针 fast (初始化为数组的起始位置) 和一个慢指针 slow(初始化为起始位置-1),可将数组分成3部分(如下图)
  • 遍历数组:快指针 fast 负责遍历数组,慢指针 slow 指向fast已遍历数组最后一个非零元素存放的位置。
  • 移动元素:当快指针 fast 指向的元素不为零时,我们将其值与慢指针 slow 指向的元素值做交换,并同时移动两个指针。如果快指针指向的元素为零,则只移动快指针。
  • 填充零:当快指针遍历完成后,数组中已符合题目要求。
    在这里插入图片描述

代码实现

以下是使用C++实现的代码示例:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int fast =  0;
        int slow = fast-1;
        for(; fast!=nums.size(); fast++){
            if(nums[fast]!=0){
                std::swap(nums[++slow] , nums[fast]);
            }
        }
    }
};

拓展

本题与快速排序的“划分”步骤思想极其相似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值