Problem description
Remove element from unsorted array.
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
.
Examples
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 being2
. It does not matter what you leave beyond the returned k (hence they are underscores).
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 containing0, 0, 1, 3, and 4
. Note that the five elements can be returned in any order.
You can find a brief description about the problem here.
Experience
My intuition is straightforward. I hold two counters; one counts elements that are not equal to the value from front to back, and the other counts the occurrences of the value from back to front, and I stop the loop when they meet somewhere in the middle. I am holding two counters because I can replace the occurrences of the value from the front with the elements that are not equal to the value from the back.
The results
- Runtime: 32 ms, faster than 96.76% of Python3 online submissions for Remove Element problem.
- Memory Usage: 13.9 MB, less than 14.38% of Python3 online submissions for Remove Element problem.
The code
def removeElement(nums: List[int], val: int) -> int:
valCounter = 0
iterator = 0
numsLength = len(nums)
while iterator < numsLength:
if nums[iterator] == val:
valCounter += 1
while valCounter < numsLength and nums[-valCounter] == val:
valCounter += 1
nums[iterator] = nums[-valCounter]
if iterator >= (numsLength - valCounter): break
iterator += 1
return iterator