283. 移动零(快慢指针)

题目要求

在这里插入图片描述
算法思想:

1.使用快慢指针,初始都设为0,慢指针指向的位置是快指针指向的非0元素的位置。
2.最优解法是直接把非0元素赋值到慢指针的位置,每次操作完快指针指向的非0元素后,都要使慢指针+1.然后最后再将数组后面的位置赋值为的0

代码实现

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

        //     //快慢指针,时间O(n),空间O(1)
        //     if(nums.length == 0 || nums == null)
        //         return;

        //     int slow = 0;
        //     for(int fast = 0; fast < nums.length; fast++){
        //         if(nums[fast] != 0){
        //             //相等时不交换,减少交换次数
        //             if(slow != fast){
        //                 int tmp = nums[fast];
        //                 nums[fast] = nums[slow];
        //                 nums[slow] = tmp;
                        
        //             }
        //             //操作完快指针指向的当前元素,慢支针+1
        //             slow++;
        //         }
        //     }

        // }

        public void moveZeroes(int[] nums) {
            if(nums.length == 0 || nums == null)
                return;

            int slow = 0;
            for(int fast = 0; fast < nums.length; fast++){
                if(nums[fast] != 0){
                    //相等时不赋值,减少操作次数。
                    if(slow != fast){
                        nums[slow] = nums[fast];
                        
                    }
                       //操作完快指针指向的当前元素,慢指针+1
                    slow++;
                }
            }
            //将slow指向的后续的数组元素赋值为0(slow后面的元素已经被移动到前面)
            for(int i = slow; i < nums.length; i++){
                nums[i] = 0;
            }

        }


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值