< Back

283. Move Zeros

Another two-pointers problem, messes with your brain a little bit but it's pretty fun. Basically you
have an array of integers, both negative and positive, and you need to move all zero values to the
end of the array.

We achieve this by using a pointer to iterate through the array, front to back, and another pointer
that maintains the position of the last encountered zero. So if a value is non-zero, we swap the
values maintained at each pointer and increment the zero pointer.

Once we encounter a zero, we essentially do a no-op, but the zero pointer remains pointing to the
zero value. Once we encounter a non-zero value, we swap the values at each pointer and increment the
zero pointer. This achieves our goal of gradually moving all zero values to the back of the array.

The solution is as follows:

  class Solution:
      def moveZeroes(self, nums: List[int]) -> None:
          Do not return anything, modify nums in-place instead.
          i = 0
          for j in range(len(nums)):
              if nums[j] != 0:
                  if nums[i] == 0:
                      nums[i], nums[j] = nums[j], nums[i]
                  i += 1

_ Time Complexity:

  O(n) - We iterate through the array once, swapping values as we go.

_ Space Complexity:

  O(1) - We modify the array in-place.