天天看點

283. 移動零(快慢指針)

題目要求

算法思想:

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;
            }

        }


    }