侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【双指针】移动零

GabrielxD
2022-10-11 / 0 评论 / 0 点赞 / 122 阅读 / 372 字
温馨提示:
本文最后更新于 2022-10-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

283. 移动零


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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

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

解题

方法一:快慢指针

思路

如果换一个说法,其实就是原地删除所有为 00 的元素,然后把后面空出来的位置全部填充上零。

所以依然可以像这样使用快慢指针:【双指针】移除元素

然后把 nums[slow...nums.length1]nums[slow ... nums.length - 1] 填充上 00

代码

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0, n = nums.length;
        for (int fast = 0; fast < n; ++fast) {
            if (nums[fast] != 0) nums[slow++] = nums[fast];
        }
        while (slow < n) nums[slow++] = 0;
    }
}

也可以更符合题意一点,删 00 的时候不覆盖,而是快慢指针进行交换,这样遍历完成后就不用填充 00 了:

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; ++fast) {
            if (nums[fast] != 0) swap(nums, slow++, fast);
        }
    }

    void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}
0

评论区