题目链接

题目描述

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

示例

示例1:

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

说明

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

    思路

    双指针

    维护两个指针 slowfast ,都从头开始遍历:
  • slow 的左边是已经处理过的元素
  • fastslow 之间为0

注:本题与0027-移除元素类似

题解

  1. class Solution {
  2. public:
  3. void moveZeroes(vector<int>& nums) {
  4. int slow = 0, fast = 0;
  5. while (fast < nums.size()) {
  6. if (nums[fast]) {
  7. swap(nums[slow], nums[fast]);
  8. ++slow;
  9. }
  10. ++fast;
  11. }
  12. }
  13. };

复杂度分析

  • 时间复杂度:0283-移动零 - 图1
  • 空间复杂度:0283-移动零 - 图2