🌕 283. 移动零

吞佛童子2022年6月9日
  • algorithm
  • array
大约 1 分钟

🌕 283. 移动零

难度: 🌕

问题描述

img_15.png


解法 1 - original

class Solution {
    public void moveZeroes(int[] nums) {
        // 思路:
        // 快慢指针 - 画图理解
        int len = nums.length;
        // 特殊情况特判
        if(len <= 1) {
            return;
        }
        // len > 1
        int left = 0;
        int right = 1;
        while(right < len) {
            // left 指针找 0 元素
            while(left < len && nums[left] != 0) {
                left ++;
            }
            // right 指针从 left 指针开始往后找非 0 元素
            right = left + 1;
            while(right < len && nums[right] == 0) {
                right ++;
            }
            if(right >= len) {
                return; // 已经不存在非 0 元素了
            }
            swap(nums, left, right);
            left ++;
        }
    }

    private void swap(int[] nums, int left, int right) {
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
    }
}

输出 1

img_14.png


解法 2 - 优化了一点点

class Solution {
    public void moveZeroes(int[] nums) {
        // 思路:
        // 快慢指针 - 画图理解
        int len = nums.length;
        // 特殊情况特判
        if(len <= 1) {
            return;
        }
        // len > 1
        int left = 0;
        int right = 1;
        while(right < len) {
            // left 指针找 0 元素
            while(left < len && nums[left] != 0) {
                left ++;
            }
            // right 指针从 left 指针开始往后找非 0 元素
            right = Math.max(left + 1, right);
            while(right < len && nums[right] == 0) {
                right ++;
            }
            if(right >= len) {
                return; // 已经不存在非 0 元素了
            }
            swap(nums, left, right);
            left ++;
        }
    }

    private void swap(int[] nums, int left, int right) {
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
    }
}

输出 2

img_16.png

上次编辑于: 2022/6/20 下午8:24:47
贡献者: liuxianzhishou