LeetCode热题100:283.移动零

简介

题目链接:https://leetcode.cn/problems/move-zeroes/description/?envType=problem-list-v2&envId=2cktkvj

解决方式:双指针

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

双指针两次遍历

class Solution {
    // 双指针两次遍历
    public void moveZeroes(int[] nums) {
        // 第一次遍历将所有非零的数放在数组的左边
        // 第二次遍历则将剩下的数组部分全部置为 0
        int i = 0;
        // 第一次遍历
        for(int j = 0; j < nums.length; j++){
            if(nums[j] != 0){
                nums[i++] = nums[j]; 
            }
        }
        // 第二次遍历。从 i 开始,因为 i 此时指向的是数组剩余全部为零的部分的开始
        for(int j = i; j < nums.length; j++){
            nums[j] = 0;
        }
    }
}

双指针一次遍历

大佬参考了快速排序的思想,是对快速排序的一种异化。

class Solution {
    // 双指针一次遍历
    public void moveZeroes(int[] nums) {
        // 特例判断
        int length;
        if(nums == null || (length = nums.length) == 0){
            return;
        }
        // 双指针参考快速排序的方式,以 0 作为左右的中间点
        // 一个指针始终指向第一个 0
        // 一个指针遍历整个数组(效果类似于找到右边第一个不为 0 的数)
        int i = 0;
        for(int j = 0; j < length; j++){
            // j 指针遍历整个数组
            // 如果当前的数字不为 0,则要与 i 指针交换
            if(nums[j] != 0){
                // 限制,如果 j 指针不大于 i 指针,则不进行交换
                // 因为这往往意味这前面的数都是非零的数,i 指针一直在移动直到找到第一个 0
                // 同时,避免 i j 指针指向同一个数而发生同一个数的交换
                if(j > i){
                    // 此时,i 指针指向第一个 0,j 指针遍历到不为零的数,则发生交换
                    // 参考快速排序。中间值是 0,不为零的数放 0 左边,反之在 0 右边
                    nums[i] = nums[j];
                    nums[j] = 0;
                    // 上述代码是对经典交换代码的优化,提升效率
                }
                // 两种情况
                // 第一种,前面都是非零数,一直在找第一个 0
                // 第二种,发生了交换,继续找第一个 0
                i++;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值