283 移动零

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

示例:

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

说明:

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

两种解法,都用到了双指针

计算每个非零元素之前 0 的个数,只做非零数与 0 之间的交换。时间复杂度 \(O(N)\),空间复杂度 \(O(1)\)

    public void moveZeroes(int[] nums) {
        int zeroNum = 0;
        int temp;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                zeroNum++;
            } else {
                temp = nums[i];
                nums[i] = 0;
                nums[i - zeroNum] = temp;
            }
        }
    }

将非零数放到指示交换位置的指针所指处。遍历完后将后续位置填充 0 。每个位置最多遍历两次,时间复杂度 \(O(N)\),空间复杂度 \(O(1)\)

    public void moveZeroes(int[] nums) {
        int i = 0;
        int temp;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] != 0) {
                nums[i] = nums[j];
                i++;
            }
        }
        while (i < nums.length) {
            nums[i] = 0;
            i++;
        }
    }
posted @ 2020-11-20 09:47  PotatoTed  阅读(68)  评论(0)    收藏  举报