27. Remove Element - Explanation
Description
Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The order of the elements may be changed. Then return the number of elements in nums which are not equal to val.
Consider the number of elements in nums which are not equal to val be k, to get accepted, you need to do the following things:
- Change the array
numssuch that the firstkelements ofnumscontain the elements which are not equal toval. The remaining elements ofnumsare not important as well as the size ofnums. - Return
k.
Custom Judge:
The judge will test your solution with the following code:
int[] nums = [...]; // Input array
int val = ...; // Value to remove
int[] expectedNums = [...]; // The expected answer with correct length.
// It is sorted with no values equaling val.
int k = removeElement(nums, val); // Calls your implementation
assert k == expectedNums.length;
sort(nums, 0, k); // Sort the first k elements of nums
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}If all assertions pass, then your solution will be accepted.
Example 1:
Input: nums = [3,2,2,3], val = 3
Output: k = 2, nums = [2,2,_,_]Explanation: Your function should return k = 2, with the first two elements of nums being 2.
It does not matter what you leave beyond the returned k (hence they are underscores).
Example 2:
Input: nums = [0,1,2,2,3,0,4,2], val = 2
Output: k = 5, nums = [0,1,3,0,4,_,_,_]Explanation: Your function should return k = 5, with the first five elements of nums containing 0, 0, 1, 3, and 4.
Note that the five elements can be returned in any order.
It does not matter what you leave beyond the returned k (hence they are underscores).
Constraints:
0 <= nums.length <= 1000 <= nums[i] <= 500 <= val <= 100
Topics
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
- Create a temporary list
tmpto store elements that are not equal toval. - Iterate through
numsand add each element totmpif it does not equalval. - Copy all elements from
tmpback into the beginning ofnums. - Return the length of
tmp, which represents how many valid elements remain.
Time & Space Complexity
- Time complexity:
- Space complexity:
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
- Initialize a pointer
k = 0to track the position for the next valid element. - Iterate through the array with index
i:- If
nums[i]is not equal toval, copy it tonums[k]and incrementk.
- If
- Return
kas the count of valid elements.
Time & Space Complexity
- Time complexity:
- Space complexity:
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
- Initialize
i = 0as the current position andnas the effective length of the array. - While
i < n:- If
nums[i]equalsval, replace it withnums[n-1]and decrementn(don't incrementisince the swapped element needs checking). - Otherwise, increment
ito move to the next element.
- If
- Return
nas the count of valid elements.
Time & Space Complexity
- Time complexity:
- Space complexity:
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.
Sign in to join the discussion