Intuition
Because the array is sorted, duplicates are adjacent. Keep a slow write-pointer at the last unique value; advance a fast pointer, and whenever it finds a value different from the last kept one, write it forward.
Explanation
Idea
Sorting groups equal values together, so a new unique value appears exactly when nums[fast] differs from the last kept value. A slow write-pointer k tracks how many uniques we've placed; we only write (and advance k) on a change.
Algorithm
- If
numsis empty, return[]. Otherwisek = 1(the first element is always kept). - For
ifrom 1 to end: ifnums[i] != nums[k-1], writenums[k] = nums[i]andk += 1. - The first
kelements are the unique values; returnnums[:k].
Worked example: [0,0,1,1,1,2,2,3,3,4]
- Keep 0. See 0 (dup). See 1 → write, k=2. 1,1 dups. See 2 → write, k=3. 2 dup. See 3 → write, k=4. 3 dup. See 4 → write, k=5.
Unique = [0,1,2,3,4] (k = 5).
Complexity
- Time: O(n).
- Space: O(1).
Implementation
import java.util.Arrays;
class Solution {
public int[] removeDuplicates(int[] nums) {
if (nums.length == 0) {
return new int[]{};
}
int k = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[k - 1]) {
nums[k] = nums[i];
k++;
}
}
return Arrays.copyOf(nums, k);
}
}