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 = 3Output:
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 = 2Output:
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