Problem Statement
Given an integer array nums, move all 0s to the end of it while maintaining the relative order of the non-zero elements.
You must do this in-place without making a copy of the array.
Examples:
Input: [0,1,0,3,12] - Output: [1,3,12,0,0]
Input: [0] - Output: [0]
Constraints:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
Approach
Use a pointer last Non Zero Found At to track the position where the next non-zero element should go.
Traverse the array. For each non-zero element, place it at the last Non Zero Found At index and increment the pointer.
After placing all non-zero elements, fill the remaining positions with 0s.
This approach ensures relative order is preserved and the array is modified in-place.
Python Code
class Solution:
def moveZeroes(self, nums):
# Pointer for the next non-zero element
lastNonZeroFoundAt = 0
# Step 1: Move non-zero elements forward
for i in range(len(nums)):
if nums[i] != 0:
nums[lastNonZeroFoundAt] = nums[i]
lastNonZeroFoundAt += 1
# Step 2: Fill remaining positions with 0
for i in range(lastNonZeroFoundAt, len(nums)):
nums[i] = 0
Example Test Case
sol = Solution()
nums1 = [0, 1, 0, 3, 12]
sol.moveZeroes(nums1)
print(nums1)
Output: [1, 3, 12, 0, 0]
nums2 = [0]
sol.moveZeroes(nums2)
print(nums2)
Output: [0]
nums3 = [4, 2, 4, 0, 0, 3, 0, 5, 1, 0]
sol.moveZeroes(nums3)
print(nums3)
# Output: [4, 2, 4, 3, 5, 1, 0, 0, 0, 0]
Explanation
For the input [0, 1, 0, 3, 12]:
last Non Zero Found At = 0
Traverse the array and place non-zero numbers at the last Non Zero Found At index: [1, 3, 12, 3, 12]
Fill remaining positions with 0: [1, 3, 12, 0, 0]
The relative order of non-zero elements is maintained.
Works in-place and is efficient.
Keep track of the position for the next non-zero element.
Move non-zero elements forward and fill zeros at the end.
Top comments (0)