Bird
Raised Fist0
DSA Goprogramming

Two Pointer Technique on Arrays in DSA Go

Choose your learning style10 modes available
Mental Model
Use two markers moving through the array to find or process pairs efficiently without extra space.
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 (value 1) and right pointer at index 4 (value 9)
[1] -> 3 -> 5 -> 7 -> [9]
 ↑                 ↑
Why: Start checking pairs from both ends to cover all possibilities efficiently
Step 2: Calculate sum: 1 + 9 = 10, which is less than 12, so move left pointer right
1 -> [3] -> 5 -> 7 -> [9]
      ↑           ↑
Why: Sum too small, increase sum by moving left pointer to higher value
Step 3: Calculate sum: 3 + 9 = 12, found the target sum
1 -> [3] -> 5 -> 7 -> [9]
      ↑           ↑
Why: Sum matches target, we found the pair
Result:
1 -> [3] -> 5 -> 7 -> [9]
      ↑           ↑
Pair found: 3 + 9 = 12
Annotated Code
DSA Go
package main

import "fmt"

func twoPointerSum(arr []int, target int) (int, int) {
    left, right := 0, len(arr)-1
    for left < right {
        sum := arr[left] + arr[right]
        if sum == target {
            return left, right // found pair
        } else if sum > target {
            right-- // decrease sum by moving right pointer left
        } else {
            left++ // increase sum by moving left pointer right
        }
    }
    return -1, -1 // no pair found
}

func main() {
    arr := []int{1, 3, 5, 7, 9}
    target := 12
    left, right := twoPointerSum(arr, target)
    if left != -1 {
        fmt.Printf("Pair found: %d + %d = %d\n", arr[left], arr[right], target)
    } else {
        fmt.Println("No pair found")
    }
}
left, right := 0, len(arr)-1
initialize two pointers at array ends
for left < right {
loop until pointers meet
sum := arr[left] + arr[right]
calculate sum of values at pointers
if sum == target { return left, right }
check if sum matches target
else if sum < target { left++ }
sum too small, move left pointer right to increase sum
else { right-- }
sum too large, move right pointer left to decrease sum
OutputSuccess
Pair found: 3 + 9 = 12
Complexity Analysis
Time: O(n) because each pointer moves at most n steps through the array once
Space: O(1) because no extra space is used besides pointers
vs Alternative: Compared to nested loops O(n^2), two pointers reduce time by scanning array only once
Edge Cases
empty array
function returns no pair found immediately
DSA Go
left, right := 0, len(arr)-1
array with one element
function returns no pair found because left is not less than right
DSA Go
for left < right {
no two numbers sum to target
function returns -1, -1 indicating no pair found
DSA Go
return -1, -1 // no pair found
When to Use This Pattern
When you need to find pairs or process elements from both ends of a sorted array efficiently, use two pointers 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 when sum is less, move right pointer left when sum is greater
Summary
Find pairs in a sorted array efficiently using two pointers moving inward.
Use when searching for pairs or conditions involving two elements in sorted arrays.
The key is adjusting pointers based on sum 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 arrays to store elements separately.
B. Use one pointer to traverse and another to store values.
C. Use two indices to scan the array from different ends or positions simultaneously.
D. Use two nested loops to compare all pairs of elements.

Solution

  1. Step 1: Understand the technique

    The two pointer technique uses two indices or pointers to traverse the array, often starting from different ends or positions.
  2. Step 2: Compare with other options

    The other options describe different methods, but only using two indices to scan the array from different ends or positions simultaneously correctly describes the two pointer approach.
  3. Final Answer:

    Use two indices to scan the array from different ends or positions simultaneously. -> Option C
  4. Quick Check:

    Two pointers move independently to solve problems efficiently [OK]
Hint: Two pointers move from ends or positions to reduce time [OK]
Common Mistakes:
  • Thinking it uses two separate arrays
  • Confusing with nested loops approach
  • Assuming only one pointer moves
2. Which of the following is the correct way to initialize two pointers left and right for an array arr in Go?
easy
A. left := 1; right := len(arr)
B. left := 0; right := len(arr) - 1
C. left := -1; right := len(arr)
D. left := 0; right := len(arr)

Solution

  1. Step 1: Understand array indexing in Go

    Arrays and slices in Go are zero-indexed, so the first element is at index 0 and the last at len(arr)-1.
  2. Step 2: Check pointer initialization

    Setting left to 0 and right to len(arr)-1 correctly points to the first and last elements respectively.
  3. Final Answer:

    left := 0; right := len(arr) - 1 -> Option B
  4. Quick Check:

    Start pointers at 0 and last index [OK]
Hint: Start left at 0 and right at last index (len-1) [OK]
Common Mistakes:
  • Setting right to len(arr) causes out-of-range error
  • Starting left at 1 misses first element
  • Using negative indices which Go does not support
3. What will be the output of the following Go code snippet?
arr := []int{1, 3, 5, 7, 9}
left, right := 0, len(arr)-1
for left < right {
    if arr[left]+arr[right] == 10 {
        fmt.Println(left, right)
        break
    } else if arr[left]+arr[right] < 10 {
        left++
    } else {
        right--
    }
}
medium
A. 0 4
B. 1 3
C. 2 3
D. No output

Solution

  1. Step 1: Trace the pointers and sums

    Initial pointers: left=0 (arr[0]=1), right=4 (arr[4]=9), sum=10 ==10, so prints 0 4 and breaks.
  2. Step 2: Verify the condition and loop

    Actually, sum=1+9=10, so it prints 0 4 and breaks immediately.
  3. Final Answer:

    0 4 -> Option A
  4. Quick Check:

    Sum 1+9=10 at indices 0 and 4 [OK]
Hint: Check sum at pointers; print indices when sum matches target [OK]
Common Mistakes:
  • Not breaking after first match
  • Confusing indices with values
  • Incorrect pointer updates
4. Find the error in the following Go code using two pointers to find if any two numbers sum to 8:
arr := []int{2, 4, 6, 8}
left, right := 0, len(arr)
for left < right {
    sum := arr[left] + arr[right]
    if sum == 8 {
        fmt.Println("Found")
        break
    } else if sum < 8 {
        left++
    } else {
        right--
    }
}
medium
A. The loop condition should be left <= right
B. left pointer should start at 1
C. sum calculation is incorrect
D. right is initialized to len(arr), which is out of range

Solution

  1. Step 1: Check pointer initialization

    right is set to len(arr), but valid indices go from 0 to len(arr)-1. This causes out-of-range error when accessing arr[right].
  2. Step 2: Verify other parts

    left starting at 0 is correct, loop condition left < right is valid, sum calculation is correct.
  3. Final Answer:

    right is initialized to len(arr), which is out of range -> Option D
  4. Quick Check:

    Array indices go 0 to len-1, not len [OK]
Hint: Initialize right pointer to len(arr)-1 to avoid out-of-range [OK]
Common Mistakes:
  • Setting right to len(arr) causes runtime error
  • Changing loop condition unnecessarily
  • Misunderstanding array indexing
5. Given a sorted array arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}, use the two pointer technique to find all pairs that sum to 10. Which of the following Go code snippets correctly prints all such pairs?
hard
A. left, right := 0, len(arr)-1 for left < right { sum := arr[left] + arr[right] if sum == 10 { fmt.Println(arr[left], arr[right]) left++ right-- } else if sum < 10 { left++ } else { right-- } }
B. left, right := 0, len(arr)-1 for left <= right { sum := arr[left] + arr[right] if sum == 10 { fmt.Println(arr[left], arr[right]) left++ right-- } else if sum < 10 { left++ } else { right-- } }
C. left, right := 0, len(arr) for left < right { sum := arr[left] + arr[right] if sum == 10 { fmt.Println(arr[left], arr[right]) left++ right-- } else if sum < 10 { left++ } else { right-- } }
D. left, right := 1, len(arr)-1 for left < right { sum := arr[left] + arr[right] if sum == 10 { fmt.Println(arr[left], arr[right]) left++ right-- } else if sum < 10 { left++ } else { right-- } }

Solution

  1. Step 1: Check pointer initialization and loop condition

    left, right := 0, len(arr)-1 for left < right { sum := arr[left] + arr[right] if sum == 10 { fmt.Println(arr[left], arr[right]) left++ right-- } else if sum < 10 { left++ } else { right-- } } initializes left=0 and right=len(arr)-1, which are valid indices. Loop runs while left < right to avoid duplicates and out-of-range.
  2. Step 2: Verify pointer updates on sum match

    When sum == 10, both pointers move inward to find other pairs. This correctly finds all pairs without repeats.
  3. Final Answer:

    left, right := 0, len(arr)-1 for left < right { sum := arr[left] + arr[right] if sum == 10 { fmt.Println(arr[left], arr[right]) left++ right-- } else if sum < 10 { left++ } else { right-- } } -> Option A
  4. Quick Check:

    Two pointers move inward, printing pairs when sum matches [OK]
Hint: Move both pointers inward on match to find all pairs [OK]
Common Mistakes:
  • Using right = len(arr) causes index error
  • Loop condition left <= right prints duplicates
  • Starting left at 1 misses pairs with first element
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