Bird
Raised Fist0
DSA Goprogramming~5 mins

Remove Duplicates from Sorted Array Two Pointer in DSA Go - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Remove Duplicates from Sorted Array Two Pointer
O(n)
Understanding Time Complexity

We want to know how fast the two-pointer method removes duplicates from a sorted array.

How does the time needed grow as the array gets bigger?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

func removeDuplicates(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    i := 0
    for j := 1; j < len(nums); j++ {
        if nums[j] != nums[i] {
            i++
            nums[i] = nums[j]
        }
    }
    return i + 1
}

This code moves through the array once, shifting unique values forward to remove duplicates.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Single for-loop scanning the array once.
  • How many times: Exactly once for each element after the first.
How Execution Grows With Input

As the array size grows, the loop runs once per element.

Input Size (n)Approx. Operations
10About 9 checks and moves
100About 99 checks and moves
1000About 999 checks and moves

Pattern observation: The operations grow linearly with input size.

Final Time Complexity

Time Complexity: O(n)

This means the time to remove duplicates grows directly in proportion to the array size.

Common Mistake

[X] Wrong: "Since we move elements, it must be slower than just scanning once."

[OK] Correct: The moves happen only when a new unique element is found, so they happen at most n times, keeping the overall time linear.

Interview Connect

Understanding this linear time approach shows you can efficiently handle arrays without extra space, a common real-world need.

Self-Check

"What if the array was not sorted? How would the time complexity change?"

Practice

(1/5)
1. What is the main purpose of using two pointers in the Remove Duplicates from Sorted Array problem?
easy
A. To efficiently track unique elements and overwrite duplicates in-place
B. To sort the array before removing duplicates
C. To create a new array with unique elements
D. To count the total number of duplicates in the array

Solution

  1. Step 1: Understand the two-pointer approach

    One pointer tracks the position to place the next unique element, the other scans the array. This method avoids extra space by overwriting duplicates directly in the original array.
  2. Final Answer:

    To efficiently track unique elements and overwrite duplicates in-place -> Option A
  3. Quick Check:

    Two pointers help remove duplicates in-place [OK]
Hint: Two pointers move to overwrite duplicates without extra space [OK]
Common Mistakes:
  • Thinking two pointers create a new array
  • Assuming sorting is needed inside the method
  • Confusing counting duplicates with removing them
2. Which of the following Go code snippets correctly initializes the two pointers for removing duplicates from a sorted array named nums?
easy
A. i, j := 0, 1
B. i, j := 1, 0
C. i, j := 0, 0
D. i, j := 1, 1

Solution

  1. Step 1: Identify pointer roles and correct initialization

    Pointer i tracks last unique index starting at 0 (first element), pointer j scans from the next element at 1 to compare adjacent elements.
  2. Final Answer:

    i, j := 0, 1 -> Option A
  3. Quick Check:

    i=0, j=1 starts correct two-pointer scan [OK]
Hint: Start i at 0 and j at 1 to compare neighbors [OK]
Common Mistakes:
  • Swapping i and j initialization
  • Starting both pointers at 0
  • Starting both pointers at 1
3. What will be the content of the array nums and the returned length after running the two-pointer duplicate removal on nums := []int{1, 1, 2, 3, 3, 4}?
medium
A. nums = [1, 2, 3, 3, 4, 4], length = 3
B. nums = [1, 1, 2, 3, 4, 4], length = 5
C. nums = [1, 2, 3, 4, 4, 4], length = 4
D. nums = [1, 2, 3, 4, 3, 4], length = 4

Solution

  1. Step 1: Trace two-pointer process

    Start i=0, j=1; compare nums[j] with nums[i]. When different, increment i and set nums[i]=nums[j]. Unique elements placed at start: 1, 2, 3, 4; length = 4; leftover elements remain unchanged. Final array: [1, 2, 3, 4, 3, 4].
  2. Final Answer:

    nums = [1, 2, 3, 4, 3, 4], length = 4 -> Option D
  3. Quick Check:

    Unique elements count = 4, array start updated [OK]
Hint: Overwrite duplicates, keep unique at front, count unique [OK]
Common Mistakes:
  • Assuming leftover elements are removed
  • Counting duplicates as unique
  • Misplacing unique elements
4. Identify the error in the following Go code snippet for removing duplicates from a sorted array nums:
func removeDuplicates(nums []int) int {
    i := 0
    for j := 1; j < len(nums); j++ {
        if nums[j] != nums[i] {
            i = j
            nums[i] = nums[j]
        }
    }
    return i + 1
}
medium
A. Loop should start from j = 0 instead of 1
B. Pointer i is incorrectly updated to j instead of incrementing
C. Return statement should be i instead of i + 1
D. Comparison should be nums[j] == nums[i] instead of !=

Solution

  1. Step 1: Analyze pointer update logic

    Pointer i should move forward by one (i++) to place unique element, not jump to j (i = j). Correct code uses i++ then nums[i] = nums[j] to overwrite duplicates properly.
  2. Final Answer:

    Pointer i is incorrectly updated to j instead of incrementing -> Option B
  3. Quick Check:

    i must increment, not jump to j [OK]
Hint: Increment i to place unique, don't assign i = j [OK]
Common Mistakes:
  • Setting i = j causes skipping elements
  • Starting loop at wrong index
  • Wrong return value calculation
5. Given a sorted array nums := []int{0,0,1,1,1,2,2,3,3,4}, what will be the final array state and length after applying the two-pointer duplicate removal method?
hard
A. nums = [0,1,1,2,3,4,4,3,3,4], length = 5
B. nums = [0,0,1,2,3,4,3,3,4,4], length = 6
C. nums = [0,1,2,3,4,2,2,3,3,4], length = 5
D. nums = [0,1,2,3,4,0,1,1,2,2], length = 4

Solution

  1. Step 1: Apply two-pointer logic step-by-step

    Start with i=0, j=1; move j forward, when nums[j] != nums[i], increment i and set nums[i]=nums[j]. Unique elements are 0,1,2,3,4 placed at start; length = 5; rest of array remains unchanged: [0,1,2,3,4,2,2,3,3,4].
  2. Final Answer:

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

    Unique count 5, array start updated correctly [OK]
Hint: Place unique elements at front, count unique length [OK]
Common Mistakes:
  • Assuming leftover elements are removed
  • Miscounting unique elements
  • Overwriting wrong indices
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