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

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

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

提示:

LeetCode283. 移动零(2024秋季每日一题 6)_算法
LeetCode283. 移动零(2024秋季每日一题 6)_算法_02

进阶: 你能尽量减少完成的操作次数吗?


思路:

  • 双指针,将所有非0元素按顺序整理到数组左段,
  • i:快指针扫描数组的所有元素,j:慢指针,用来指向替换后的数组的位置。
  • 当 i 扫描到的是非 0 元素,则 nums[j++] = nums[i],j,i 同时向后移动,当 i 扫描到的是 0,则只有 i 向后移动。
  • 最后将 j 指针后面的所有位置 置0,相当于将所有 0 移到数组后面。

时间复杂度:LeetCode283. 移动零(2024秋季每日一题 6)_双指针_03

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int j = 0;
        for(int i = 0; i < nums.size(); i++){
            if(nums[i] != 0) nums[j++] = nums[i];
        }
        while(j < nums.size()) nums[j++] = 0;
    }
};