Remove Duplicates from Sorted Array Two Pointer in DSA C++ - Time & Space Complexity
We want to understand how the time needed to remove duplicates from a sorted array grows as the array gets bigger.
Specifically, how does the process of scanning and updating the array scale with its size?
Analyze the time complexity of the following code snippet.
int removeDuplicates(std::vector<int>& nums) {
int i = 0;
for (int j = 1; j < nums.size(); 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.
- Primary operation: The for-loop that scans the array once from start to end.
- How many times: It runs exactly once for each element after the first, so about n-1 times for an array of size n.
As the array size grows, the number of steps grows roughly the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 9 comparisons and possible assignments |
| 100 | About 99 comparisons and possible assignments |
| 1000 | About 999 comparisons and possible assignments |
Pattern observation: The operations increase linearly as the input size increases.
Time Complexity: O(n)
This means the time to remove duplicates grows directly in proportion to the size of the array.
[X] Wrong: "Since we check pairs, the time complexity is O(n²)."
[OK] Correct: We only scan the array once with two pointers moving forward, so each element is visited once, not repeatedly.
Understanding this linear time approach shows you can efficiently handle arrays without extra space, a common skill interviewers look for.
"What if the array was not sorted? How would the time complexity change if we still tried to remove duplicates in place?"
Practice
Solution
Step 1: Understand the two-pointer roles
One pointer tracks the position to place unique elements, the other scans the array.Step 2: Overwrite duplicates in-place
When a new unique element is found, it is placed at the tracked position, replacing duplicates.Final Answer:
To track unique elements and overwrite duplicates in-place -> Option AQuick Check:
Two-pointer technique = overwrite duplicates [OK]
- Thinking it creates a new array instead of modifying in-place
- Assuming it sorts the array again
- Confusing counting duplicates with removing them
nums in C++?Solution
Step 1: Identify pointer roles
Pointer i tracks the last unique element index, starting at 0; j scans from 1.Step 2: Initialize pointers accordingly
Set i = 0 and j = 1 to start comparing from the second element.Final Answer:
int i = 0, j = 1; -> Option AQuick Check:
i=0, j=1 start positions [OK]
- Starting both pointers at 0
- Swapping i and j initialization
- Starting j before i
nums = {1, 1, 2, 3, 3, 4}?Solution
Step 1: Identify unique elements in order
Unique elements are 1, 2, 3, 4.Step 2: Count unique elements
There are 4 unique elements, so the length after removal is 4.Final Answer:
4 -> Option BQuick Check:
Unique count = 4 [OK]
- Counting duplicates as unique
- Confusing length with original array size
- Off-by-one errors in counting
nums:
int removeDuplicates(vector<int>& nums) {
int i = 0, j = 1;
while (j < nums.size()) {
if (nums[i] != nums[j]) {
i++;
nums[i] = nums[j];
}
j++;
}
return i;
}Solution
Step 1: Understand pointer i meaning
Pointer i is index of last unique element, so length is i + 1.Step 2: Check return statement
Returning i alone gives index, not count; must return i + 1 for length.Final Answer:
Return value should be i + 1, not i -> Option DQuick Check:
Length = last index + 1 [OK]
- Returning i instead of i + 1
- Swapping pointer initializations
- Using wrong comparison operator
nums = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4}, what will be the state of the array after applying the two-pointer method to remove duplicates, and what is the new length?Solution
Step 1: Identify unique elements in order
Unique elements are 0, 1, 2, 3, 4.Step 2: Overwrite duplicates in-place
Using two pointers, these unique elements overwrite the start of the array.Step 3: Determine new length
There are 5 unique elements, so length is 5.Final Answer:
Array: {0, 1, 2, 3, 4, _, _, _, _, _}, Length: 5 -> Option CQuick Check:
Unique elements = 5, array start updated [OK]
- Not overwriting duplicates correctly
- Miscounting unique elements
- Assuming array length stays same
Ready to prove it?
Pass the test and this pattern moves unknown
