283. Move Zeroes

Problem


Tags: Array, Two Pointers

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

Note that you must do this in-place without making a copy of the array.

Example 1:

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

Example 2:

Input: nums = [0]
Output: [0]

Constraints:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

Follow up: Could you minimize the total number of operations done?

Code

C

// 283. Move Zeroes (5/17/54029)
// Runtime: 129 ms (32.74%) Memory: 15.29 MB (22.96%) 

void moveZeroes(int nums[], int numsSize) {
    int head = 0;
    
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] != 0) {
            nums[head++] = nums[i];
        }
    }
    
    for (int i = head; i < numsSize; i++) {
        nums[i] = 0;
    }
    
    return;
}

JS

// 283. Move Zeroes (6/24/53718)
// Runtime: 92 ms (84.65%) Memory: 43.36 MB (94.89%) 

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
function moveZeroes(nums) {
    let ptr = 0,
        zeros = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== 0) nums[ptr++] = nums[i];
        else zeros++;
    }
    for (let i = ptr; i < nums.length; i++) nums[i] = 0;
}