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:
val does not matter.k positions of the array.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 <= 1000 <= nums[i] <= 500 <= val <= 100Before attempting this problem, you should be comfortable with:
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.
tmp to store elements that are not equal to val.nums and add each element to tmp if it does not equal val.tmp back into the beginning of nums.tmp, which represents how many valid elements remain.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.
k = 0 to track the position for the next valid element.i:nums[i] is not equal to val, copy it to nums[k] and increment k.k as the count of valid elements.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.
i = 0 as the current position and n as the effective length of the array.i < n:nums[i] equals val, replace it with nums[n-1] and decrement n (don't increment i since the swapped element needs checking).i to move to the next element.n as the count of valid elements.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.
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.