Two Pointers

Array Sweeps

Signal

Sorted array, find a pair/triplet hitting a target

Template

Converge left/right pointers.

Worked example (1)

#3

Two Pointers

Two Pointers

Given an integer array, return all unique triplets that sum to zero.

function threeSum(nums: number[]): number[][] {
  const a = [...nums].sort((x, y) => x - y);
  const res: number[][] = [];
  for (let i = 0; i < a.length - 2; i++) {
    if (i > 0 && a[i] === a[i - 1]) continue; // skip duplicate anchor
    let lo = i + 1, hi = a.length - 1;
    while (lo < hi) {
      const sum = a[i] + a[lo] + a[hi];
      if (sum === 0) {
        res.push([a[i], a[lo], a[hi]]);
        lo++; hi--;
        while (lo < hi && a[lo] === a[lo - 1]) lo++; // skip dup values
        while (lo < hi && a[hi] === a[hi + 1]) hi--;
      } else if (sum < 0) lo++;
      else hi--;
    }
  }
  return res;
}
Insight

Sorting (O(n log n)) unlocks the two-pointer sweep, giving O(n²) total instead of O(n³).