27. Remove Element - Explanation

Problem Link

Description

You are given an integer array nums and an integer val. Your task is to remove all occurrences of val from nums in-place.

After removing all occurrences of val, return the number of remaining elements, say k, such that the first k elements of nums do not contain val.

Note:

  • The order of the elements which are not equal to val does not matter.
  • It is not necessary to consider elements beyond the first k positions of the array.
  • To be accepted, the first k elements of nums must contain only elements not equal to val.

Return k as the final result.

Example 1:

Input: nums = [1,1,2,3,4], val = 1

Output: [2,3,4]

Explanation: You should return k = 3 as we have 3 elements which are not equal to val = 1.

Example 2:

Input: nums = [0,1,2,2,3,0,4,2], val = 2

Output: [0,1,3,0,4]

Explanation: You should return k = 5 as we have 5 elements which are not equal to val = 2.

Constraints:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100


Topics

Company Tags

Please upgrade to NeetCode Pro to view company tags.



Prerequisites

Before attempting this problem, you should be comfortable with:

  • Arrays - Understanding how to traverse and modify array elements by index
  • Two Pointers Technique - Using multiple pointers to track positions during array manipulation
  • In-Place Modification - Modifying an array without using extra space

1. Brute Force

Intuition

The simplest way to remove elements is to collect all the values we want to keep into a separate list.
We iterate through the array, skip any element that matches the target value, and store the rest.
Then we copy everything back into the original array.
This works but uses extra space proportional to the input size.

Algorithm

  1. Create a temporary list tmp to store elements that are not equal to val.
  2. Iterate through nums and add each element to tmp if it does not equal val.
  3. Copy all elements from tmp back into the beginning of nums.
  4. Return the length of tmp, which represents how many valid elements remain.
class Solution:
    def removeElement(self, nums: list[int], val: int) -> int:
        tmp = []
        for num in nums:
            if num == val:
                continue
            tmp.append(num)
        for i in range(len(tmp)):
            nums[i] = tmp[i]
        return len(tmp)

Time & Space Complexity

  • Time complexity: O(n)O(n)
  • Space complexity: O(n)O(n)

2. Two Pointers - I

Intuition

Instead of using extra space, we can overwrite unwanted elements in place.
We use a write pointer k that tracks where the next valid element should go.
As we scan through the array, whenever we find an element that is not equal to val, we write it at position k and move k forward.
At the end, everything before index k contains valid elements.

Algorithm

  1. Initialize a pointer k = 0 to track the position for the next valid element.
  2. Iterate through the array with index i:
    • If nums[i] is not equal to val, copy it to nums[k] and increment k.
  3. Return k as the count of valid elements.
class Solution:
    def removeElement(self, nums: list[int], val: int) -> int:
        k = 0
        for i in range(len(nums)):
            if nums[i] != val:
                nums[k] = nums[i]
                k += 1
        return k

Time & Space Complexity

  • Time complexity: O(n)O(n)
  • Space complexity: O(1)O(1)

3. Two Pointers - II

Intuition

When there are few elements to remove, the previous approach does unnecessary copying.
Instead, we can swap unwanted elements with elements from the end of the array.
When we encounter the target value, we replace it with the last element and shrink the valid range by one.
This minimizes write operations when removals are rare.

Algorithm

  1. Initialize i = 0 as the current position and n as the effective length of the array.
  2. While i < n:
    • If nums[i] equals val, replace it with nums[n-1] and decrement n (don't increment i since the swapped element needs checking).
    • Otherwise, increment i to move to the next element.
  3. Return n as the count of valid elements.
class Solution:
    def removeElement(self, nums: list[int], val: int) -> int:
        i = 0
        n = len(nums)
        while i < n:
            if nums[i] == val:
                n -= 1
                nums[i] = nums[n]
            else:
                i += 1
        return n

Time & Space Complexity

  • Time complexity: O(n)O(n)
  • Space complexity: O(1)O(1)

Common Pitfalls

Returning the Wrong Value

A common mistake is returning the length of the original array instead of the count of remaining elements. The problem asks for the number of elements that are not equal to val, which may be less than the original array length. Always return the write pointer position (k or n) that tracks how many valid elements exist after removal.

Incrementing the Pointer After a Swap

When using the swap-with-end approach (Two Pointers - II), forgetting to recheck the current position after swapping leads to missed removals. After replacing nums[i] with the last element, the swapped element might also equal val and needs to be checked. Only increment i when the current element is valid; otherwise, decrement n and keep i unchanged.