What if you could find pairs in a list without checking every single combination?
Why Two Pointer Technique on Arrays in DSA Javascript?
Imagine you have a long list of numbers and you want to find pairs that add up to a certain value. Doing this by checking every possible pair one by one feels like searching for a needle in a haystack.
Checking every pair means lots of repeated work and takes a long time, especially if the list is very long. It's easy to make mistakes or miss pairs because you have to remember which pairs you already checked.
The two pointer technique uses two markers that move through the list from different ends. This way, you can find pairs quickly without checking every combination, saving time and effort.
for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { if (arr[i] + arr[j] === target) { console.log(arr[i], arr[j]); } } }
let sorted = arr.slice().sort((a, b) => a - b); let left = 0; let right = sorted.length - 1; while (left < right) { let sum = sorted[left] + sorted[right]; if (sum === target) { console.log(sorted[left], sorted[right]); left++; right--; } else if (sum < target) { left++; } else { right--; } }
This technique makes it easy and fast to find pairs or solve problems involving two elements moving from opposite ends.
Think about two people starting at opposite ends of a hallway trying to find the perfect spot to meet in the middle based on their walking speeds.
Manual pair checking is slow and error-prone.
Two pointers move from both ends to find pairs efficiently.
This method reduces time and simplifies the search process.
Practice
Two Pointer Technique when used on arrays?Solution
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.Step 2: Purpose of two pointers
This helps solve problems like finding pairs, removing duplicates, or partitioning without extra space and in linear time.Final Answer:
Use two indices moving towards each other or in the same direction to solve problems efficiently -> Option AQuick Check:
Two pointers = two indices moving efficiently [OK]
- Confusing with nested loops approach
- Assuming sorting is always required
- Thinking recursion is part of two pointers
left and right for an array arr in JavaScript?Solution
Step 1: Understand pointer initialization
For two pointers starting at the array ends,leftstarts at 0 (start),rightatarr.length - 1(end).Step 2: Check each option
const left = 0, right = arr.length - 1; correctly setsleft = 0andright = arr.length - 1. Others have incorrect indices.Final Answer:
const left = 0, right = arr.length - 1; -> Option DQuick Check:
Start pointer at 0, end pointer at length-1 [OK]
- Setting right pointer to arr.length (out of bounds)
- Swapping left and right initialization
- Using 1-based indexing instead of 0-based
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);Solution
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.Step 2: Check the result array
Result contains [[1,5],[2,4],[3,3]]. But note the conditionleft <= rightallows the middle element pairing only if left equals right.
Here, at left=2 and right=2, sum=6, so [3,3] is added.Final Answer:
[[1,5],[2,4],[3,3]] -> Option CQuick Check:
Pairs summing to 6 = [[1,5],[2,4],[3,3]] [OK]
- Ignoring the case when left equals right
- Not updating pointers correctly after finding a pair
- Assuming only pairs with different indices count
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;
}Solution
Step 1: Analyze pointer usage
The variablerightis set but never used inside the loop or condition, making it unnecessary.Step 2: Check loop and comparison logic
The loop correctly checks adjacent elements usingleftpointer only, sorightcan be removed without affecting logic.Final Answer:
The right pointer is unused and unnecessary -> Option BQuick Check:
Unused variable right pointer = bug [OK]
- Thinking right pointer must be used in two pointer technique always
- Changing loop condition unnecessarily
- Confusing adjacent element checks with two pointer sum checks
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?
Solution
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.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.Final Answer:
Option A code snippet -> Option AQuick Check:
Correct pointer moves based on sum vs target [OK]
- Moving wrong pointer when sum is greater or smaller
- Using for loop that moves both pointers simultaneously
- Starting both pointers at same index
Ready to prove it?
Pass the test and this pattern moves unknown
