Bird
Raised Fist0
DSA Cprogramming~5 mins

Remove Duplicates from Sorted Array Two Pointer in DSA C - 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 understand how the time needed to remove duplicates from a sorted array grows as the array gets bigger.

Specifically, how many steps does the two-pointer method take as the input size increases?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


int removeDuplicates(int* nums, int numsSize) {
    if (numsSize == 0) return 0;
    int i = 0;
    for (int j = 1; j < numsSize; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}
    

This code removes duplicates from a sorted array by using two pointers to overwrite duplicates in place.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The for-loop that moves pointer j from start to end of the array.
  • How many times: Exactly once for each element after the first, so numsSize - 1 times.
How Execution Grows With Input

As the array size grows, the loop runs once for each element, so the steps increase directly with input size.

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

Pattern observation: The number of operations grows linearly as the input size increases.

Final Time Complexity

Time Complexity: O(n)

This means the time to remove duplicates grows in direct proportion to the number of elements in the array.

Common Mistake

[X] Wrong: "Because we skip duplicates, the time complexity is less than linear."

[OK] Correct: Even if duplicates are skipped, the loop still checks every element once, so the time grows linearly with input size.

Interview Connect

Understanding this linear time solution shows you can efficiently process sorted data with simple pointers, a skill often valued in coding challenges.

Self-Check

"What if the array was not sorted? How would the time complexity change if we still tried to remove duplicates in place?"

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.
  2. Step 2: Purpose of pointers in-place

    This method avoids extra space by overwriting duplicates directly in the original array.
  3. Final Answer:

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

    Two pointers help remove duplicates in-place [OK]
Hint: Two pointers track unique and current elements [OK]
Common Mistakes:
  • Thinking two pointers sort the array
  • Assuming a new array is created
  • Confusing counting duplicates with removing them
2. Which of the following is the correct syntax to initialize two pointers i and j for the two-pointer approach in C?
easy
A. int i = 0, j = 1;
B. int i = 1, j = 0;
C. int i = 0; int j = 0;
D. int i, j = 0;

Solution

  1. Step 1: Understand pointer roles

    Pointer i starts at 0 (first unique), j starts at 1 (scanning next elements).
  2. Step 2: Correct initialization syntax

    Both pointers must be initialized properly; int i = 0, j = 1; is correct in C.
  3. Final Answer:

    int i = 0, j = 1; -> Option A
  4. Quick Check:

    Initialize i=0 and j=1 for two-pointer [OK]
Hint: Start i at 0 and j at 1 for scanning [OK]
Common Mistakes:
  • Swapping initial values of i and j
  • Initializing both pointers to 0
  • Incorrect declaration syntax
3. What will be the output length after removing duplicates using the two-pointer method on the sorted array [1, 1, 2, 3, 3, 4]?
medium
A. 6
B. 5
C. 3
D. 4

Solution

  1. Step 1: Trace the two-pointer process

    Start with i=0, j=1. Compare elements: duplicates skipped, unique elements moved forward.
  2. Step 2: Count unique elements

    Unique elements are 1, 2, 3, 4. So length is 4 after removal.
  3. Final Answer:

    4 -> Option D
  4. Quick Check:

    Unique elements count = 4 [OK]
Hint: Count unique elements after skipping duplicates [OK]
Common Mistakes:
  • Counting duplicates as unique
  • Assuming length stays same
  • Miscounting unique elements
4. Identify the bug in this C code snippet for removing duplicates from a sorted array:
int removeDuplicates(int* nums, int numsSize) {
    int i = 0, j = 1;
    while (j < numsSize) {
        if (nums[i] != nums[j]) {
            i++;
            nums[i] = nums[j];
        }
        j++;
    }
    return i;
}
medium
A. Does not check for array size zero
B. Pointers i and j are initialized incorrectly
C. Returns i instead of i+1 as new length
D. Uses while loop instead of for loop

Solution

  1. Step 1: Analyze return value

    Variable i tracks last unique index, so length is i+1, not i.
  2. Step 2: Identify correct return

    Returning i misses counting the first element, causing off-by-one error.
  3. Final Answer:

    Returns i instead of i+1 as new length -> Option C
  4. Quick Check:

    Return length = i+1, not i [OK]
Hint: Return last index + 1 for length [OK]
Common Mistakes:
  • Off-by-one error in return value
  • Ignoring empty array edge case
  • Confusing pointer initialization
5. Given a sorted array nums = [0,0,1,1,1,2,2,3,3,4], what will be the array state after applying the two-pointer method to remove duplicates?
hard
A. [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]
B. [0, 1, 2, 3, 4, _, _, _, _, _]
C. [0, 1, 1, 2, 3, 4, _, _, _, _]
D. [0, 1, 2, 3, 4, 5, _, _, _, _]

Solution

  1. Step 1: Apply two-pointer overwrite

    Unique elements 0,1,2,3,4 are moved to front positions in array.
  2. Step 2: Final array state

    Positions after unique elements remain unchanged or ignored (represented as underscores).
  3. Final Answer:

    [0, 1, 2, 3, 4, _, _, _, _, _] -> Option B
  4. Quick Check:

    Array front holds unique elements [OK]
Hint: Unique elements overwrite front, rest ignored [OK]
Common Mistakes:
  • Assuming duplicates remain in place
  • Misplacing unique elements
  • Confusing array length with content
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