Remove Duplicates from Sorted Array
Given an integer array numskknums
Example 1
Input: nums = [1,1,2]
Output: k = 2, nums = [1,2,_]
Output: k = 2, nums = [1,2,_]
Example 2
Input: nums = [0,0,1,1,1,2,2,3,3,4]
Output: k = 5, nums = [0,1,2,3,4,_,_,_,_,_]
Output: k = 5, nums = [0,1,2,3,4,_,_,_,_,_]
Constraints:
1 <= nums.length <= 3 * 104-100 <= nums[i] <= 100- Array is sorted in non-decreasing order.
Solution: Slow/Fast Two Pointers
slowfast
- Start
,slow = 0 .fast = 1 - Whenever
, we found a new unique value: incrementnums[fast] != nums[slow] and copy it.slow is the count of unique elements.slow + 1
Java
public int removeDuplicates(int[] nums) {
int slow = 0;
for (int fast = 1; fast < nums.length; fast++) {
if (nums[fast] != nums[slow]) {
slow++;
nums[slow] = nums[fast]; // place next unique element
}
// else: duplicate — fast moves forward, slow stays
}
return slow + 1; // number of unique elements
}
Trace through Example 2: nums = [0,0,1,1,1,2,2,3,3,4]
| fast | nums[fast] | nums[slow] | Action | slow |
|---|---|---|---|---|
| 1 | 0 | 0 | duplicate, skip | 0 |
| 2 | 1 | 0 | new → slow=1, nums[1]=1 | 1 |
| 3 | 1 | 1 | duplicate, skip | 1 |
| 4 | 1 | 1 | duplicate, skip | 1 |
| 5 | 2 | 1 | new → slow=2, nums[2]=2 | 2 |
| 6 | 2 | 2 | duplicate, skip | 2 |
| 7 | 3 | 2 | new → slow=3, nums[3]=3 | 3 |
| 8 | 3 | 3 | duplicate, skip | 3 |
| 9 | 4 | 3 | new → slow=4, nums[4]=4 | 4 |
Return slow + 1 = 5
Complexity Analysis
- Time: O(n). Single pass through the array.
- Space: O(1). in-place modification, no extra space.