Skip to main content

Read / Write Heads

Two pointers walk the same array in the same direction: a read head scans every element, and a write head marks where the next kept element belongs. Whatever the read head decides to keep gets written at the write head, which only then advances - so the prefix [0, write) is always the compacted answer.

Remove Elements

27. Remove Element

Easy·

Solutions:
Visualize
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums)
read = write = 0
while read < n:
if nums[read] != val:
nums[write] = nums[read]
write += 1
read += 1
return write

283. Move Zeroes

Easy·

Solutions:
Visualize
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
read = write = 0
while read < n:
if nums[read] != 0:
nums[write] = nums[read]
write += 1
read += 1
 
while write < n:
nums[write] = 0
write += 1

1119. Remove Vowels from a String

Easy·

Solutions:
Visualize
class Solution:
def removeVowels(self, s: str) -> str:
s = list(s)
n = len(s)
read = write = 0
vowels = set("aeiou")
while read < n:
if s[read] not in vowels:
s[write] = s[read]
write += 1
read += 1
return "".join(s[:write])

Remove Elements from Sorted Array

80. Remove Duplicates from Sorted Array II

Medium·

Solutions:
Visualize
def removeDuplicatesK(nums, k: int):
n = len(nums)
read = write = 0
while read < n:
if read < k or nums[write - k] < nums[read]:
nums[write] = nums[read]
write += 1
read += 1
return write
 
 
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
return removeDuplicatesK(nums, k=2)

26. Remove Duplicates from Sorted Array

Easy·

Solutions:
Visualize
def removeDuplicatesK(nums, k: int):
n = len(nums)
read = write = 0
while read < n:
if read < k or nums[write - k] < nums[read]:
nums[write] = nums[read]
write += 1
read += 1
return write
 
 
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
return removeDuplicatesK(nums, k=1)

Sort the Array

922. Sort Array By Parity II

Easy·

Solutions:
Visualize
class Solution:
def sortArrayByParityII(self, nums: List[int]) -> List[int]:
n = len(nums)
read, write = 1, 0
while read < n:
if nums[read] % 2 == 1:
read += 2
elif nums[write] % 2 == 0:
write += 2
else:
nums[read], nums[write] = nums[write], nums[read]
read += 2
write += 2
return nums