Move Zeros LT283

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Example:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Note:

  1. You must do this in-place without making a copy of the array.
  2. Minimize the total number of operations.

Idea 1. Two pointer, as partion array in quick sort, move all non-zeros to the front.

Time complexity: O(N)

Space complexity: O(1)

class Solution {
    public void moveZeroes(int[] nums) {
        int dest = 0;
        for(int i = 0; i < nums.length; ++i) {
            if(nums[i] != 0) {
                nums[dest++] = nums[i];
            }
        }
        
        while(dest < nums.length) {
            nums[dest] = 0;
            ++dest;
        }
    }
}

Idea 1.a if there are more zeros, swap elements, save the step to put zeros to the end, only swap if there are zeros on the left, no need to write back to the same element

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

猜你喜欢

转载自www.cnblogs.com/taste-it-own-it-love-it/p/10850833.html