283. 移动零

暴力解法

class Solution {
    public void moveZeroes(int[] nums) {

        /**
         * 使用额外的数组存放非零元素
         */
        int[] temp = new int[nums.length];
        int index = 0;

        for (int i = 0; i < nums.length; i++) {

            if (nums[i] != 0){
                temp[index++] = nums[i];
            }
        }

        for (int i = 0; i < nums.length; i++) {
            nums[i] = temp[i];
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

优化1——双指针法

class Solution {
    public void moveZeroes(int[] nums) {

        /**
         * 不使用额外的空间,left指向左边非零子数组的后一位,right指向当前遍历元素
         * 记录最后一个非零元素的位置
         */
        int left = 0;

        for (int right = 0; right < nums.length; right++) {

            if (nums[right] != 0){

                nums[left] = nums[right];
                left++;
            }
        }

        for (int i = left; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化2——不单独赋值后面的元素为零

class Solution {
    public void moveZeroes(int[] nums) {

        /**
         * 每当遇到一个非零元素,就和第left个元素互换位置,left初始为0
         * 这样所有的非零元素都会按顺序在前面,0全部被换到了后面
         */
        int left = 0;
        int temp = 0;

        for (int right = 0; right < nums.length; right++) {

            if (nums[right] != 0){

                temp = nums[right];
                nums[right] = nums[left];
                nums[left] = temp;
                left++;
            }
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化3——减少交换元素的次数

class Solution {
    public void moveZeroes(int[] nums) {

        /**
         * 每当遇到一个非零元素,就和第left个元素互换位置,left初始为0
         * 这样所有的非零元素都会按顺序在前面,0全部被换到了后面
         */
        int left = 0;
        int temp = 0;

        for (int right = 0; right < nums.length; right++) {

            if (nums[right] != 0){

                /**
                 * 如果数组都是非零元素,那么每次都会和自己交换
                 * 因此判断一下是否真的需要交换
                 */
                if (right != left) {
                    
                    temp = nums[right];
                	nums[right] = nums[left];
                	nums[left] = temp;
                }

                left++;
            }
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/move-zeroes/

posted @ 2021-11-23 15:57  振袖秋枫问红叶  阅读(34)  评论(0)    收藏  举报