Move Zeroes

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 <= 104
  • -231 <= nums[i] <= 231 - 1


My Solution

We can solve this problem with two pointers, i and j. If nums[j] != 0, we copy nums[j] to nums[i] and move both pointers forward. If nums[j] == 0, we move j forward, but keep i the same. Once j reaches the end of the array, we just add zeros for the rest of the elements.

Time complexity is O(n) because it requires one pass through the array. Space complexity is O(1) because it only requires constant extra space.

class Solution {
    public void moveZeroes(int[] nums) {
        int i = 0;
        int j = 0;
        int n = nums.length;

        while (j < n) {
            if (nums[j] == 0) {
                j++;
            }
            else {
                nums[i] = nums[j];
                i++;
                j++;
            }
        }

        while (i < n) {
            nums[i] = 0;
            i++;
        }
    }
}
Previous
Previous

Word Pattern

Next
Next

First Bad Version