Skip to main content

27 Remove Element

Description

Given an array of integers and a target value, your task is to remove all occurrences of that value directly within the array.

You must perform the operation in-place, without using extra space for another array.

The final length of the modified array should be returned, and the first k elements should contain the remaining values.

The order of elements does not matter beyond the returned length.

Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.

Custom Judge:

The judge will test your solution with the following code:

int[] nums = [...]; // Input array
int val = ...; // Value to remove
int k = removeElement(nums, val); // Calls your implementation

assert k == expectedLength;
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: 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: 5, nums = [0,1,4,0,3,_,_,_]
Explanation: Your function should return k = 5, with the first five elements of nums containing 0, 1, 4, 0, and 3.
Note that the order of those five elements can be arbitrary.
It does not matter what values are set beyond the returned k (hence they are underscores).

Constraints:

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

We need to filter out all values equal to val, shifting valid ones to the front. Since the order doesn't matter, we can use a two-pointer approach:

The Right pointer move from right to left, skip val, point to last element that not val. The Left pointer move from left to right, if it point to val, replace with value of right pointer.

class Solution {
public int removeElement(int[] nums, int val) {
var left = 0;
var right = nums.length - 1;
while(left <= right) {
if(nums[right] == val) {
right--;
} else if (nums[left] == val) {
nums[left] = nums[right];
left++;
right--;
} else {
left++;
}
}
return left;
}
}