力扣刷题笔记【双指针篇】 → 283. 移动零

302 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

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

示例

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

提示

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

解题思路

双指针

要求必须在原数组上完成操作,并且需要尽量减少操作次数。那这里我们就不能使用额外的空间来快速保存结果,只能通过指针移动来使得后面的数值转移至前面。同时,我们需要将数组中为0的元素数量记录下来,便于后续元素移动时计算移动区间。

class Solution {
    public void moveZeroes(int[] nums) {
        // zeroCount 记录为 0 的元素数量
        int n = nums.length, zeroCount = 0;

        for(int i = 0; i < n; ++i){
            // 当前元素为0,区间 +1
            if(nums[i] == 0){
                ++zeroCount;
            }else{
                // 当前元素不为0,前移zeroCount位,由前面为0的元素决定具体前移位置
                nums[i - zeroCount] = nums[i];
            }
        }

        // 将后续所有元素修改为0
        for(int i = n - zeroCount; i < n; ++i){
            nums[i] = 0;
        }
    }
}

 复杂度分析

  •   时间复杂度:O(N)O(N)
  •   空间复杂度:O(1)O(1)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/mo…