Two Pointer Technique on Arrays in DSA C++ - Time & Space Complexity
We want to understand how fast the two pointer technique works on arrays.
Specifically, how the number of steps grows as the array gets bigger.
Analyze the time complexity of the following code snippet.
int left = 0, right = n - 1;
while (left < right) {
if (arr[left] + arr[right] == target) {
// found pair
break;
} else if (arr[left] + arr[right] < target) {
left++;
} else {
right--;
}
}
This code uses two pointers moving from both ends to find a pair summing to a target.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop moving pointers left and right.
- How many times: Each pointer moves at most n times combined.
As the array size grows, the total steps increase roughly in a straight line.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The steps grow directly with input size, not faster or slower.
Time Complexity: O(n)
This means the time to run grows in a straight line as the array gets bigger.
[X] Wrong: "Since there are two pointers, the time is O(n²)."
[OK] Correct: Each pointer only moves forward and never goes back, so total moves are at most n, not n times n.
Knowing this technique and its time cost helps you solve many array problems efficiently.
"What if the array was not sorted? How would the time complexity change?"
Practice
Two Pointer Technique when used on arrays?Solution
Step 1: Understand the technique
The Two Pointer Technique uses two indices to traverse the array, often from opposite ends or different positions, to solve problems efficiently.Step 2: Compare with other options
Options B and C describe different methods, and D uses only one pointer, so they do not match the Two Pointer Technique.Final Answer:
Use two indices to scan the array from different ends or positions simultaneously -> Option AQuick Check:
Two pointers = two indices scanning array [OK]
- Thinking it always requires sorting first
- Confusing with nested loops approach
- Using only one pointer instead of two
left and right for an array arr of size n in C++?Solution
Step 1: Understand pointer initialization
For two pointers scanning from start and end, left starts at 0 and right at n-1 (last index).Step 2: Check each option
int left = 0, right = n - 1; correctly sets left=0 and right=n-1. Options A, B, and C have incorrect indices that may cause out-of-bound errors.Final Answer:
int left = 0, right = n - 1; -> Option DQuick Check:
Start = 0, End = n-1 [OK]
- Setting right pointer to n (out of bounds)
- Swapping left and right initial values
- Starting left pointer at 1 instead of 0
int arr[] = {1, 2, 3, 4, 5, 6};
int left = 0, right = 5;
int sum = 0;
while (left < right) {
sum += arr[left] + arr[right];
left++;
right--;
}
std::cout << sum << std::endl;Solution
Step 1: Trace the loop iterations
Initial pointers: left=0, right=5
Iteration 1: sum=0+arr[0]+arr[5]=0+1+6=7, left=1, right=4
Iteration 2: sum=7+arr[1]+arr[4]=7+2+5=14, left=2, right=3
Iteration 3: sum=14+arr[2]+arr[3]=14+3+4=21, left=3, right=2 (loop ends)Step 2: Final sum value
Sum after loop is 21.Final Answer:
21 -> Option CQuick Check:
Sum pairs (1+6)+(2+5)+(3+4) = 21 [OK]
- Including middle element when pointers cross
- Adding elements twice
- Incorrect loop condition (<= instead of <)
bool hasPairSum(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int sum = arr[left] + arr[right];
if (sum == target) return true;
else if (sum < target) left++;
else right--;
}
return false;
}Solution
Step 1: Analyze loop condition
The loop runs while left <= right, which allows pointers to be equal, causing sum of same element twice.Step 2: Correct loop condition
Changing condition to left < right ensures pointers do not overlap, avoiding incorrect sum calculation.Final Answer:
The loop condition should be left < right instead of left <= right -> Option AQuick Check:
Pointers must not cross or overlap [OK]
- Allowing pointers to be equal causing wrong sums
- Incorrect pointer initialization
- Returning false too early inside loop
arr of size n, how can you use the two pointer technique to find all unique pairs that sum up to a target value t? Which approach is correct?Solution
Step 1: Set pointers and move inward
Start with left at 0 and right at n-1. Move pointers inward based on sum compared to target.Step 2: Skip duplicates to find unique pairs
After finding a pair, increment left and decrement right while skipping duplicate values to avoid repeated pairs.Final Answer:
Initialize left = 0 and right = n - 1, move pointers inward, skip duplicates after finding a pair -> Option BQuick Check:
Two pointers inward + skip duplicates = unique pairs [OK]
- Not skipping duplicates causing repeated pairs
- Using nested loops causing higher time complexity
- Incorrect pointer initialization or movement
Ready to prove it?
Pass the test and this pattern moves unknown
