easy Move Zeroes
Problem Statement
Given an array of integers nums, move all the 0s, which are present in the array to the end while maintaining the relative order of the non-zero elements.
Note: This rearrangement should be done in-place without using extra space for another array.
Example 1:
- Input:
[1, 0, 2, 0, 3, 0, 4] - Expected Output:
[1, 2, 3, 4, 0, 0, 0] - Justification: Here, all non-zero elements (1, 2, 3, 4) retain their order, and all zeros are moved to the end of the array.
Example 2:
- Input:
[0, 0, 0, 10, 20] - Expected Output:
[10, 20, 0, 0, 0] - Justification: The non-zero elements (10, 20) are shifted to the front, and the zeros are relocated to the end.
Example 3:
- Input:
[5, 1, 0, 2, 0] - Expected Output:
[5, 1, 2, 0, 0] - Justification: Non-zero elements (5, 1, 2) maintain their sequence, while zeros are moved to the end.
Try it yourself
Try solving this question here:
✅ Solution Move Zeroes
Problem Statement
Given an array of integers nums, move all the 0s present in the array to the end while maintaining the relative order of the non-zero elements.
Note: This rearrangement should be done in-place without using extra space for another array.
Example 1:
- Input:
[1, 0, 2, 0, 3, 0, 4] - Expected Output:
[1, 2, 3, 4, 0, 0, 0] - Justification: Here, all non-zero elements (1, 2, 3, 4) retain their order, and all zeros are moved to the end of the array.
Example 2:
- Input:
[0, 0, 0, 10, 20] - Expected Output:
[10, 20, 0, 0, 0] - Justification: The non-zero elements (10, 20) are shifted to the front, and the zeros are relocated to the end.
Example 3:
- Input:
[5, 1, 0, 2, 0] - Expected Output:
[5, 1, 2, 0, 0] - Justification: Non-zero elements (5, 1, 2) maintain their sequence, while zeros are moved to the end.
Solution
To solve this problem, we will use a two-pointer approach. The first pointer (i) will iterate over the array, and the second pointer (lastNonZeroIndex) will keep track of the position where the next non-zero element should be placed.
This approach is efficient as it allows us to perform the operation in-place, reducing the space complexity. It's also effective because it ensures that the relative order of non-zero elements is maintained by sequentially filling non-zero elements from the start. As we iterate through the array, we swap non-zero elements with the element at the lastNonZeroIndex and increment lastNonZeroIndex. This method is optimal as it requires a single pass over the array, ensuring linear time complexity.
Step-by-step algorithm
- Initialize
lastNonZeroIndexto 0. - Iterate through each element (
i) in the array:- If the current element is not zero:
- Swap the element at
iwith the element atlastNonZeroIndex. - Increment
lastNonZeroIndex.
- Swap the element at
- If the current element is not zero:
- This process groups all non-zero elements at the beginning of the array and zeros at the end, maintaining their original order.
Algorithm Walkthrough
Let's take Example 1 [1, 0, 2, 0, 3, 0, 4]:
- Start with
lastNonZeroIndex = 0andi = 0. - Iterate through the array:
- At
i = 0, element 1 is non-zero, swap it with itself, and incrementlastNonZeroIndexto 1. - At
i = 1, element 0 is zero, continue. - At
i = 2, element 2 is non-zero, swap it with the first 0 (at indexlastNonZeroIndex, which is 1),lastNonZeroIndexbecomes 2. - At
i = 3, element 0 is zero, continue. - At
i = 4, element 3 is non-zero, swap it with the 0 (at indexlastNonZeroIndex, which is 2),lastNonZeroIndexbecomes 3. - At
i = 5, element 0 is zero, continue. - At
i = 6, element 4 is non-zero, swap it with the 0 (at indexlastNonZeroIndex, which is 3),lastNonZeroIndexbecomes 4.
- At
- Resulting array after completion:
[1, 2, 3, 4, 0, 0, 0].
Code
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Solution {
// Method to move zeroes to the end
public List<Integer> moveZeroes(List<Integer> nums) {
int lastNonZeroIndex = 0; // Tracks the position to place the next non-zero element
// Iterate over the array
for (int i = 0; i < nums.size(); i++) {
// If the current element is non-zero
if (nums.get(i) != 0) {
// Swap the current element with the element at lastNonZeroIndex
Collections.swap(nums, i, lastNonZeroIndex++);
}
}
return nums;
}
// Main method to test the solution
public static void main(String[] args) {
Solution solution = new Solution();
// Test with different examples
// Example 1
List<Integer> example1 = new ArrayList<>(List.of(1, 0, 2, 0, 3, 0, 4));
System.out.println("Example 1: " + solution.moveZeroes(example1));
// Example 2
List<Integer> example2 = new ArrayList<>(List.of(0, 0, 0, 10, 20));
System.out.println("Example 2: " + solution.moveZeroes(example2));
// Example 3
List<Integer> example3 = new ArrayList<>(List.of(5, 1, 0, 2, 0));
System.out.println("Example 3: " + solution.moveZeroes(example3));
}
}
Complexity Analysis
- Time Complexity: O(n), where n is the length of the array, as We iterate through the array once.
- Space Complexity: O(1), as the rearrangement is done in-place without using extra space.
🤖 Don't fully get this? Learn it with Claude
Stuck on Move Zeroes? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Move Zeroes** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Move Zeroes** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Move Zeroes**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Move Zeroes**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.