引言
在今天的文章中,我们将探讨一个经典的算法问题——移动零。这个问题要求我们将数组中的所有零移动到数组的末尾,同时保持非零元素的相对顺序不变。我们将使用双指针技巧来解决这个问题,这是一种在处理数组或链表时非常高效的方法。
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]);
}
}
}
};
拓展
本题与快速排序的“划分”步骤思想极其相似