Bird
Raised Fist0
DSA Javascriptprogramming

Two Pointer Technique on Arrays in DSA Javascript

Choose your learning style10 modes available
Mental Model
Use two markers moving through the array to find pairs or conditions without checking every pair.
Analogy: Imagine two friends starting at opposite ends of a hallway, walking towards each other to find a matching pair of shoes quickly.
Array: [1, 3, 5, 7, 9]
Pointers: ↑left                 right↑
Dry Run Walkthrough
Input: array: [1, 3, 5, 7, 9], find two numbers that sum to 12
Goal: Find two numbers in the array that add up to 12 using two pointers
Step 1: Initialize left pointer at index 0 and right pointer at index 4
1 [left->] 3 5 7 [←right] 9
Why: Start checking pairs from both ends to find the sum efficiently
Step 2: Calculate sum: 1 + 9 = 10, which is less than 12, move left pointer right
1 3 [left->] 5 7 [←right] 9
Why: Sum too small, increase it by moving left pointer to a bigger number
Step 3: Calculate sum: 3 + 9 = 12, found the pair
1 3 [left->] 5 7 [←right] 9
Why: Sum matches target, stop searching
Result:
1 3 5 7 [3 + 9 = 12] 9
Answer: Pair found (3, 9)
Annotated Code
DSA Javascript
class TwoPointer {
  static findPairWithSum(arr, target) {
    let left = 0;
    let right = arr.length - 1;
    while (left < right) {
      const sum = arr[left] + arr[right];
      if (sum === target) {
        return [arr[left], arr[right]];
      } else if (sum < target) {
        left++; // increase sum by moving left pointer right
      } else {
        right--; // decrease sum by moving right pointer left
      }
    }
    return null; // no pair found
  }
}

const array = [1, 3, 5, 7, 9];
const targetSum = 12;
const result = TwoPointer.findPairWithSum(array, targetSum);
if (result) {
  console.log(`Pair found: (${result[0]}, ${result[1]})`);
} else {
  console.log('No pair found');
}
while (left < right) {
loop until pointers meet to check all pairs
const sum = arr[left] + arr[right];
calculate sum of elements at pointers
if (sum === target) { return [arr[left], arr[right]]; }
found pair matching target sum, return it
else if (sum < target) { left++; }
sum too small, move left pointer right to increase sum
else { right--; }
sum too big, move right pointer left to decrease sum
OutputSuccess
Pair found: (3, 9)
Complexity Analysis
Time: O(n) because each pointer moves at most n steps through the array once
Space: O(1) because only two pointers and a few variables are used
vs Alternative: Compared to checking all pairs (O(n^2)), this is much faster by avoiding repeated checks
Edge Cases
empty array
returns null immediately as no pairs exist
DSA Javascript
while (left < right) {
array with one element
returns null because left is not less than right
DSA Javascript
while (left < right) {
no pair sums to target
returns null after pointers cross without finding pair
DSA Javascript
return null; // no pair found
When to Use This Pattern
When you need to find pairs or conditions involving two elements in a sorted array, use two pointers moving inward to reduce time from quadratic to linear.
Common Mistakes
Mistake: Not moving pointers correctly when sum is less or greater than target
Fix: Move left pointer right if sum is less, move right pointer left if sum is greater
Mistake: Using two nested loops instead of two pointers
Fix: Use two pointers to achieve linear time instead of quadratic
Summary
Find pairs in a sorted array efficiently using two pointers moving from both ends.
Use when searching for pairs or conditions involving two elements in sorted arrays.
The key is moving pointers inward based on comparison to target to avoid checking all pairs.

Practice

(1/5)
1. What is the main idea behind the Two Pointer Technique when used on arrays?
easy
A. Use two indices moving towards each other or in the same direction to solve problems efficiently
B. Use two nested loops to compare every pair of elements
C. Sort the array first and then use binary search
D. Use recursion to divide the array into two parts

Solution

  1. Step 1: Understand the technique

    The two pointer technique uses two indices (pointers) to traverse the array, often starting from opposite ends or the same end.
  2. Step 2: Purpose of two pointers

    This helps solve problems like finding pairs, removing duplicates, or partitioning without extra space and in linear time.
  3. Final Answer:

    Use two indices moving towards each other or in the same direction to solve problems efficiently -> Option A
  4. Quick Check:

    Two pointers = two indices moving efficiently [OK]
Hint: Think of two fingers scanning array ends or start [OK]
Common Mistakes:
  • Confusing with nested loops approach
  • Assuming sorting is always required
  • Thinking recursion is part of two pointers
2. Which of the following is the correct syntax to initialize two pointers left and right for an array arr in JavaScript?
easy
A. var left = 1, right = arr.length;
B. let left = arr.length, right = 0;
C. const left = arr.length - 1, right = 0;
D. const left = 0, right = arr.length - 1;

Solution

  1. Step 1: Understand pointer initialization

    For two pointers starting at the array ends, left starts at 0 (start), right at arr.length - 1 (end).
  2. Step 2: Check each option

    const left = 0, right = arr.length - 1; correctly sets left = 0 and right = arr.length - 1. Others have incorrect indices.
  3. Final Answer:

    const left = 0, right = arr.length - 1; -> Option D
  4. Quick Check:

    Start pointer at 0, end pointer at length-1 [OK]
Hint: Start left at 0 and right at last index [OK]
Common Mistakes:
  • Setting right pointer to arr.length (out of bounds)
  • Swapping left and right initialization
  • Using 1-based indexing instead of 0-based
3. What will be the output of the following JavaScript code?
const arr = [1, 2, 3, 4, 5];
let left = 0;
let right = arr.length - 1;
const result = [];
while (left <= right) {
  if (arr[left] + arr[right] === 6) {
    result.push([arr[left], arr[right]]);
    left++;
    right--;
  } else if (arr[left] + arr[right] < 6) {
    left++;
  } else {
    right--;
  }
}
console.log(result);
medium
A. [[2,4],[3,3]]
B. [[1,5],[3,3]]
C. [[1,5],[2,4],[3,3]]
D. [[1,5],[2,4]]

Solution

  1. Step 1: Trace the two pointers and sums

    Initially left=0 (1), right=4 (5), sum=6 -> push [1,5], move left=1, right=3.
    Now left=1 (2), right=3 (4), sum=6 -> push [2,4], move left=2, right=2.
    Now left=2 (3), right=2 (3), sum=6 -> push [3,3], move left=3, right=1 but loop ends since left > right.
  2. Step 2: Check the result array

    Result contains [[1,5],[2,4],[3,3]]. But note the condition left <= right allows the middle element pairing only if left equals right.
    Here, at left=2 and right=2, sum=6, so [3,3] is added.
  3. Final Answer:

    [[1,5],[2,4],[3,3]] -> Option C
  4. Quick Check:

    Pairs summing to 6 = [[1,5],[2,4],[3,3]] [OK]
Hint: Check sums at left and right, move pointers accordingly [OK]
Common Mistakes:
  • Ignoring the case when left equals right
  • Not updating pointers correctly after finding a pair
  • Assuming only pairs with different indices count
4. Find the bug in the following code that uses two pointers to check if an array is sorted in non-decreasing order.
function isSorted(arr) {
  let left = 0;
  let right = arr.length - 1;
  while (left < right) {
    if (arr[left] > arr[left + 1]) {
      return false;
    }
    left++;
  }
  return true;
}
medium
A. The loop condition should be left <= right
B. The right pointer is unused and unnecessary
C. The comparison should be between arr[left] and arr[right]
D. The function does not handle empty arrays

Solution

  1. Step 1: Analyze pointer usage

    The variable right is set but never used inside the loop or condition, making it unnecessary.
  2. Step 2: Check loop and comparison logic

    The loop correctly checks adjacent elements using left pointer only, so right can be removed without affecting logic.
  3. Final Answer:

    The right pointer is unused and unnecessary -> Option B
  4. Quick Check:

    Unused variable right pointer = bug [OK]
Hint: Check if all declared variables are used [OK]
Common Mistakes:
  • Thinking right pointer must be used in two pointer technique always
  • Changing loop condition unnecessarily
  • Confusing adjacent element checks with two pointer sum checks
5. Given a sorted array arr and a target sum target, which code snippet correctly uses the two pointer technique to find if there exists a pair that sums to target?
const arr = [1, 3, 4, 5, 7, 10, 12];
const target = 9;
// Which snippet is correct?
hard
A. let left = 0, right = arr.length - 1; while (left < right) { const sum = arr[left] + arr[right]; if (sum === target) return true; else if (sum < target) left++; else right--; } return false;
B. let left = 0, right = arr.length - 1; while (left <= right) { const sum = arr[left] + arr[right]; if (sum === target) return true; else if (sum > target) left++; else right--; } return false;
C. for (let left = 0, right = arr.length - 1; left < right; left++, right--) { if (arr[left] + arr[right] === target) return true; } return false;
D. let left = 0, right = 0; while (left < arr.length && right < arr.length) { if (arr[left] + arr[right] === target) return true; else if (arr[left] + arr[right] < target) right++; else left++; } return false;

Solution

  1. Step 1: Understand two pointer approach for pair sum

    Start with pointers at array ends: left=0, right=length-1. Move pointers based on sum compared to target.
  2. Step 2: Check each option logic

    let left = 0, right = arr.length - 1; while (left < right) { const sum = arr[left] + arr[right]; if (sum === target) return true; else if (sum < target) left++; else right--; } return false; correctly moves left pointer forward if sum < target, right pointer backward if sum > target, and returns true if sum equals target.
    let left = 0, right = arr.length - 1; while (left <= right) { const sum = arr[left] + arr[right]; if (sum === target) return true; else if (sum > target) left++; else right--; } return false; incorrectly moves left pointer forward when sum > target.
    for (let left = 0, right = arr.length - 1; left < right; left++, right--) { if (arr[left] + arr[right] === target) return true; } return false; moves both pointers every iteration, missing some pairs.
    let left = 0, right = 0; while (left < arr.length && right < arr.length) { if (arr[left] + arr[right] === target) return true; else if (arr[left] + arr[right] < target) right++; else left++; } return false; starts both pointers at 0, which is incorrect for this problem.
  3. Final Answer:

    Option A code snippet -> Option A
  4. Quick Check:

    Correct pointer moves based on sum vs target [OK]
Hint: Move left if sum less, right if sum more [OK]
Common Mistakes:
  • Moving wrong pointer when sum is greater or smaller
  • Using for loop that moves both pointers simultaneously
  • Starting both pointers at same index
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard