[刷题班] LeetCode283. 移动零

发布时间 2024-01-08 12:10:22作者: Ac_c0mpany丶

题目描述

方法一:时间复杂度O(n2)

class Solution {
    public void moveZeroes(int[] nums) {
        for (int i = 0; i < nums.length; i ++) {
            // 指针i为0的时候停止
            if (nums[i] == 0) {
                // 遍历[i + 1, nums.length - 1],如果遇到nums[j] != 0,就交换两个位置的元素值
                for (int j = i + 1; j < nums.length; j ++) {
                    if (nums[j] != 0) {
                        int temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;
                        break;
                    }
                }
            }
        }
    }
}

方法二:双指针,时间复杂度O(n)

快慢指针

class Solution {
    public void moveZeroes(int[] nums) {
       // 定义快慢指针
       int slow = 0, fast = 0;
       for (; fast < nums.length; fast ++) {
           if (nums[fast] != 0) {
               int temp = nums[fast];
               nums[fast] = nums[slow];
               nums[slow++] = temp;
           }
       }
    }
}

方法三:双指针,优化

覆盖操作 + 置零操作

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