Two Pointers

Use when: Sorted array, pair/triplet sum, palindrome check, merging.

Complexity: O(N)

Opposite Ends (sorted array)

def two_sum_sorted(nums, target):
    left, right = 0, len(nums) - 1
 
    while left < right:
        s = nums[left] + nums[right]
        if s == target:
            return [left, right]
        elif s < target:
            left += 1
        else:
            right -= 1
 
    return []

Same Direction (fast/slow)

# Remove duplicates in-place
def remove_duplicates(nums):
    slow = 0
    for fast in range(1, len(nums)):
        if nums[fast] != nums[slow]:
            slow += 1
            nums[slow] = nums[fast]
    return slow + 1

Palindrome Check

def is_palindrome(s):
    left, right = 0, len(s) - 1
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1
    return True

Three Sum Pattern

def three_sum(nums):
    nums.sort()
    result = []
 
    for i in range(len(nums) - 2):
        if i > 0 and nums[i] == nums[i-1]:
            continue  # skip duplicates
        left, right = i + 1, len(nums) - 1
        while left < right:
            s = nums[i] + nums[left] + nums[right]
            if s == 0:
                result.append([nums[i], nums[left], nums[right]])
                while left < right and nums[left] == nums[left+1]: left += 1
                while left < right and nums[right] == nums[right-1]: right -= 1
                left += 1; right -= 1
            elif s < 0:
                left += 1
            else:
                right -= 1
 
    return result

Signals in a Problem

  • Sorted array, find pairs with a property
  • “Two sum”, “three sum”
  • Palindrome / symmetry
  • Merge two sorted arrays