80. Remove Duplicates from Sorted Array II
Remove the duplicates in-place such that each unique element appears atmost twice. The relative order of the elements should be kept the same.
Input: nums = [1,1,2,2,2,2,2,3,3,3,3,3]
Output: 2, nums = [1,1,2,2,3,3]
Return the number of unique elements in nums
.
Do not allocate extra space for another array. Achieve this by modifying the input array in-place with $\text{O}(1)$ extra memory.
Intuition
We can move an element forward by the amount of duplicates before it.
Approach
We track the occurrence of an element.
Start moving the next elements forward only if the current elements occurrence is greater 2.
Complexity
Time complexity : $\text{O}(n)$
We iterate the array only once
Space complexity : $\text{O}(1)$
We use no extra space, do operations in-place
Code
public int removeDuplicates(int[] nums) {
int occurence = 1,shift = 0;
for (int i = 1; i < nums.length; ++i) {
if(nums[i] == nums[i-1]) {
occurence++;
// only if there are more thantn 2 occurence
// we can overwrite it
if(occurence > 2) {
shift++;
continue;
}
} else {
// If the current element doesn't match the previous element
// we reset the counter
occurence = 1;
}
nums[i - shift] = nums[i];
}
return nums.length - shift;
}
Another Way
public int removeDuplicates(int[] nums) {
// This tracks where the current element must be placed
int i = 0;
for (int n : nums)
// If length is < 2
// If the current element is not equal to the element two
// places behind it
if (i < 2 || n > nums[i - 2])
nums[i++] = n;
return i;
}
Last updated